<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../../xsl/proof.xsl"?>
<COORDINATES><NAME>LEFTNEIGHBORS-correct</NAME><CONCLUSION>1</CONCLUSION><IMAGE>proof-tree.png</IMAGE><WIDTH>270</WIDTH><HEIGHT>870</HEIGHT><LIST><NODE><X>125</X><Y>825</Y><NUM>1</NUM></NODE><NODE><X>125</X><Y>785</Y><NUM>2</NUM></NODE><NODE><X>125</X><Y>745</Y><NUM>3</NUM></NODE><NODE><X>125</X><Y>705</Y><NUM>4</NUM></NODE><NODE><X>125</X><Y>665</Y><NUM>5</NUM></NODE><NODE><X>125</X><Y>625</Y><NUM>6</NUM></NODE><NODE><X>225</X><Y>585</Y><NUM>40</NUM></NODE><NODE><X>225</X><Y>545</Y><NUM>41</NUM></NODE><NODE><X>225</X><Y>505</Y><NUM>42</NUM></NODE><NODE><X>225</X><Y>465</Y><NUM>43</NUM></NODE><NODE><X>225</X><Y>425</Y><NUM>44</NUM></NODE><NODE><X>165</X><Y>585</Y><NUM>22</NUM></NODE><NODE><X>185</X><Y>545</Y><NUM>26</NUM></NODE><NODE><X>185</X><Y>505</Y><NUM>27</NUM></NODE><NODE><X>185</X><Y>465</Y><NUM>28</NUM></NODE><NODE><X>185</X><Y>425</Y><NUM>29</NUM></NODE><NODE><X>185</X><Y>385</Y><NUM>30</NUM></NODE><NODE><X>185</X><Y>345</Y><NUM>31</NUM></NODE><NODE><X>185</X><Y>305</Y><NUM>32</NUM></NODE><NODE><X>185</X><Y>265</Y><NUM>33</NUM></NODE><NODE><X>185</X><Y>225</Y><NUM>34</NUM></NODE><NODE><X>185</X><Y>185</Y><NUM>35</NUM></NODE><NODE><X>185</X><Y>145</Y><NUM>36</NUM></NODE><NODE><X>185</X><Y>105</Y><NUM>37</NUM></NODE><NODE><X>185</X><Y>65</Y><NUM>38</NUM></NODE><NODE><X>185</X><Y>25</Y><NUM>39</NUM></NODE><NODE><X>145</X><Y>545</Y><NUM>23</NUM></NODE><NODE><X>145</X><Y>505</Y><NUM>24</NUM></NODE><NODE><X>145</X><Y>465</Y><NUM>25</NUM></NODE><NODE><X>105</X><Y>585</Y><NUM>17</NUM></NODE><NODE><X>105</X><Y>545</Y><NUM>18</NUM></NODE><NODE><X>105</X><Y>505</Y><NUM>19</NUM></NODE><NODE><X>105</X><Y>465</Y><NUM>20</NUM></NODE><NODE><X>105</X><Y>425</Y><NUM>21</NUM></NODE><NODE><X>45</X><Y>585</Y><NUM>7</NUM></NODE><NODE><X>45</X><Y>545</Y><NUM>8</NUM></NODE><NODE><X>45</X><Y>505</Y><NUM>9</NUM></NODE><NODE><X>45</X><Y>465</Y><NUM>10</NUM></NODE><NODE><X>65</X><Y>425</Y><NUM>14</NUM></NODE><NODE><X>65</X><Y>385</Y><NUM>15</NUM></NODE><NODE><X>65</X><Y>345</Y><NUM>16</NUM></NODE><NODE><X>25</X><Y>425</Y><NUM>11</NUM></NODE><NODE><X>25</X><Y>385</Y><NUM>12</NUM></NODE><NODE><X>25</X><Y>345</Y><NUM>13</NUM></NODE></LIST><PROOF><LIST><PROOFNODE proofname="LEFTNEIGHBORS-correct"><NUM>1</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ> ⊦ ⟨LEFTNEIGHBORS(x; ; lneighbors)⟩ (lneighbors = leftneighbors(x))</SEQ><NEWGOALS><LIST><LE><PAIR><FST>2</FST><SND><SEQ> ⊦ ⟨LEFTNEIGHBORS(x; ; lneighbors)⟩ (lneighbors = leftneighbors(x, &#35; x))</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
leftneighbors:  ⊦ leftneighbors(x) = leftneighbors(x, &#35; x);</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="1"><NUM>2</NUM><TYPE>step</TYPE><INFO>User applied rule call right</INFO><SEQ> ⊦ ⟨LEFTNEIGHBORS(x; ; lneighbors)⟩ (lneighbors = leftneighbors(x, &#35; x))</SEQ><NEWGOALS><LIST><LE><PAIR><FST>3</FST><SND><SEQ>⊦ ⟨lneighbors := []; 
   let xpos = 1, stack = []
   in while xpos ≤ &#35; x
      do {/* _:
             invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                       ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
             wfbound &#35; x + 1 - xpos; 
          */; 
          while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
          do {/* _:
                 invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                           ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
                 wfbound &#35; stack; 
              */; 
              stack := stack.tail}; 
          if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>pos: right 1</RULEARGS><EXTRAS>Used simplifier rules:
LEFTNEIGHBORS-decl:  ⊦ ;</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="2"><NUM>3</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>⊦ ⟨lneighbors := []; 
   let xpos = 1, stack = []
   in while xpos ≤ &#35; x
      do {/* _:
             invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                       ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
             wfbound &#35; x + 1 - xpos; 
          */; 
          while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
          do {/* _:
                 invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                           ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
                 wfbound &#35; stack; 
              */; 
              stack := stack.tail}; 
          if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ><NEWGOALS><LIST><LE><PAIR><FST>4</FST><SND><SEQ>lneighbors = []
⊦ ⟨let xpos = 1, stack = []
   in while xpos ≤ &#35; x
      do {/* _:
             invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                       ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
             wfbound &#35; x + 1 - xpos; 
          */; 
          while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
          do {/* _:
                 invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                           ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
                 wfbound &#35; stack; 
              */; 
              stack := stack.tail}; 
          if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="3"><NUM>4</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule let right</INFO><SEQ>lneighbors = []
⊦ ⟨let xpos = 1, stack = []
   in while xpos ≤ &#35; x
      do {/* _:
             invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                       ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
             wfbound &#35; x + 1 - xpos; 
          */; 
          while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
          do {/* _:
                 invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                           ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
                 wfbound &#35; stack; 
              */; 
              stack := stack.tail}; 
          if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ><NEWGOALS><LIST><LE><PAIR><FST>5</FST><SND><SEQ>lneighbors = [], stack = [], xpos = 1
⊦ ⟨while xpos ≤ &#35; x
   do {/* _:
          invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                    ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
          wfbound &#35; x + 1 - xpos; 
       */; 
       while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
       do {/* _:
              invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                        ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
              wfbound &#35; stack; 
           */; 
           stack := stack.tail}; 
       if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="4"><NUM>5</NUM><TYPE>step</TYPE><INFO>Heuristic annotation applied rule annotation right</INFO><SEQ>lneighbors = [], stack = [], xpos = 1
⊦ ⟨while xpos ≤ &#35; x
   do {/* _:
          invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
                    ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
          wfbound &#35; x + 1 - xpos; 
       */; 
       while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
       do {/* _:
              invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                        ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
              wfbound &#35; stack; 
           */; 
           stack := stack.tail}; 
       if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1}⟩ 
     (lneighbors = leftneighbors(x, &#35; x))</SEQ><NEWGOALS><LIST><LE><PAIR><FST>6</FST><SND><SEQ>stack = [] ↔ xpos = 1, lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, 
bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack ≠ [] → stack.head = xpos - 1
⊦ ⟨while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
   do {/* _:
          invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                    ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
          wfbound &#35; stack; 
       */; 
       stack := stack.tail}; 
   if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>rule: invariant right
arg: inv:   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack)
          ∧ bounded(stack, 1, xpos) ∧ lneighbors = leftneighbors(x, xpos - 1)
          ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1)
     fmapos: right 1
     bound: &#35; x + 1 - xpos
pos: right 1</RULEARGS><EXTRAS>Used simplifier rules:
ordered-base:  ⊦ ordered&gt;([]);
bounded-base:  ⊦ bounded([], n0, n1);
leftneighbors-base:  ⊦ leftneighbors(x, 0) = [];
valid-stack-base:  ⊦ valid-stack([], x);
leftneighbors-base:  ⊦ leftneighbors(x, 0) = [];
 ⊦ m ≤ n ↔ ¬ n &lt; m; (ss)
 ⊦ m &lt; n → n ≠ 0; (s)
 ⊦ m &lt; n → (n ≤ m + 1 ↔ n = m + 1); (s)
eqle-one:  ⊦ m = n + 1 ∧ n &lt; n0 → m ≤ n0; (forward) from specification nat
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
lf-01:  ⊦ m &lt; n ∧ n = n0 → m &lt; n0; (forward) from specification nat-basic
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ &#35; x = 0 ↔ x = []; (s)
 ⊦ &#35; [] = 0; (s)
 ⊦ m + 1 ≠ 0; (s)
 ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s)
 ⊦ n + 0 = n; (s)
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
 ⊦ m ≤ m + n; (s)
Used formulas:   xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack)
∧ bounded(stack, 1, xpos) ∧ lneighbors = leftneighbors(x, xpos - 1)
∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1), &#35; x + 1 - xpos = &#35; x + 1 - xpos</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="5"><NUM>6</NUM><TYPE>step</TYPE><INFO>Heuristic annotation applied rule annotation right</INFO><SEQ>stack = [] ↔ xpos = 1, lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, 
bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack ≠ [] → stack.head = xpos - 1
⊦ ⟨while stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!
   do {/* _:
          invariant   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
                    ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
          wfbound &#35; stack; 
       */; 
       stack := stack.tail}; 
   if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>7</FST><SND><SEQ>stack = [] ↔ xpos = 1, lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, 
bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, stack ≠ [] → stack.head = xpos - 1
⊦   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
  ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)</SEQ></SND></PAIR></LE><LE><PAIR><FST>17</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), 
ordered&gt;(stack), valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, ¬ x[stack.head]! &lt; x[xpos]!, 
stack2 ≠ [] → stack2.head = xpos - 1, stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := stack.tail⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
         ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!))
      ∧ &#35; stack &lt; &#35; stack1)</SEQ></SND></PAIR></LE><LE><PAIR><FST>22</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), 
valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE><LE><PAIR><FST>40</FST><SND><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), 
xpos ≤ &#35; x
⊦ ⟨throw ]!; if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  0 &lt; stack.head ∧ stack.head ≤ &#35; x</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>rule: invariant right
arg: inv:   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
          ∧ valid-stack(stack, x)
          ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)
     fmapos: right 1
     bound: &#35; stack
pos: right 1</RULEARGS><EXTRAS>Used simplifier rules:
one-based-lookup:  ⊦ x[n]! = x[n -1];
 ⊦ n -1 = n - 1; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
Used formulas:   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
∧ valid-stack(stack, x) ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), &#35; stack = &#35; stack</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="6"><NUM>7</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack = [] ↔ xpos = 1, lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, 
bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, stack ≠ [] → stack.head = xpos - 1
⊦   xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
  ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>8</FST><SND><SEQ>stack = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) ≠ first-lower(stack, x, x[xpos - 1]), xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, xpos ≠ 1 → stack.head = xpos - 1
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
one-based-lookup:  ⊦ x[n]! = x[n -1];
 ⊦ n -1 = n - 1; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="7"><NUM>8</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>stack = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) ≠ first-lower(stack, x, x[xpos - 1]), xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, xpos ≠ 1 → stack.head = xpos - 1
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>9</FST><SND><SEQ>stack = [] ↔ xpos = 1, xpos = xpos0 + 1, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), xpos ≠ 0, bounded(stack, 1, xpos), 
ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, xpos ≠ 1 → stack.head = xpos0
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: nat, name:elim-pred-c, seq:n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1, 
subst:[n, m] → [xpos, xpos0]</RULEARGS><EXTRAS>Used simplifier rules:
n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim)
Used terms: xpos, m</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="8"><NUM>9</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack = [] ↔ xpos = 1, xpos = xpos0 + 1, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), xpos ≠ 0, bounded(stack, 1, xpos), 
ordered&gt;(stack), valid-stack(stack, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, xpos ≠ 1 → stack.head = xpos0
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>10</FST><SND><SEQ>stack = [] ↔ xpos0 = 0, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), 
ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ &#35; x = 0 ↔ x = []; (s)
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ m &lt; n → m ≤ n; (s)
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
 ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)
 ⊦ m + 1 ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="9"><NUM>10</NUM><TYPE>step</TYPE><INFO>User applied rule constructor cut</INFO><SEQ>stack = [] ↔ xpos0 = 0, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), 
ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>11</FST><SND><SEQ>stack = [] ↔ xpos0 = 0, stack = [], leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), 
ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ></SND></PAIR></LE><LE><PAIR><FST>14</FST><SND><SEQ>stack = [] ↔ xpos0 = 0, stack = xpos + stack0, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, 
bounded(stack, 1, xpos0 + 1), ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>var: stack</RULEARGS><EXTRAS>Used simplifier rules:
natlist freely generated by [], +;;</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="10"><NUM>11</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack = [] ↔ xpos0 = 0, stack = [], leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), 
ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>12</FST><SND><SEQ>leftneighbor(x, 0) ≠ 0, x ≠ [] ⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
first-lower-base:  ⊦ first-lower([], x, a) = 0;
valid-stack-base:  ⊦ valid-stack([], x);
ordered-base:  ⊦ ordered&gt;([]);
bounded-base:  ⊦ bounded([], n0, n1);
 ⊦ &#35; x = 0 ↔ x = []; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
lel:  ⊦ a &lt; b ∧ a = c → c &lt; b; (forward) from specification oelem[natlist]</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="11"><NUM>12</NUM><TYPE>step</TYPE><INFO>User applied rule apply rewrite lemma</INFO><SEQ>leftneighbor(x, 0) ≠ 0, x ≠ [] ⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>13</FST><SND><SEQ>n &lt; &#35; x ⊦ leftneighbor(x, n) = 0 ↔ (∀ m. m &lt; n → ¬ x[m] &lt; x[n])</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: &lt;toplevel&gt;, name:leftneighbor-zero, 
seq:n &lt; &#35; x ⊦ leftneighbor(x, n) = 0 ↔ (∀ m. m &lt; n → ¬ x[m] &lt; x[n]), 
subst:[x, n] → [x, 0], &lt;all paths&gt;</RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ x ≠ [] → x[0] = x.head; (s)
 ⊦ ¬ n &lt; 0; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
 ⊦ &#35; x = 0 ↔ x = []; (s)
Used terms: x, 0</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="12"><NUM>13</NUM><TYPE>lemma</TYPE><INFO>leftneighbor-zero</INFO><SEQ>n &lt; &#35; x ⊦ leftneighbor(x, n) = 0 ↔ (∀ m. m &lt; n → ¬ x[m] &lt; x[n])</SEQ></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="10"><NUM>14</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack = [] ↔ xpos0 = 0, stack = xpos + stack0, leftneighbor(x, xpos0) ≠ first-lower(stack, x, x[xpos0]), x ≠ [], xpos0 &lt; &#35; x, 
bounded(stack, 1, xpos0 + 1), ordered&gt;(stack), valid-stack(stack, x), xpos0 ≠ 0 → stack.head = xpos0
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>15</FST><SND><SEQ>&#35; x ≠ 1, leftneighbor(x, xpos0) ≠ first-lower(xpos0 ' + stack0, x, x[xpos0]), x ≠ [], xpos0 ≠ 0, xpos0 &lt; &#35; x, bounded(stack0, 1, xpos0 + 1), 
ordered&gt;(xpos0 ' + stack0), valid-stack(xpos0 ' + stack0, x), 1 ≤ xpos0
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
 ⊦ &#35; x = 0 ↔ x = []; (s)
 ⊦ 1 &lt; m ↔ ¬(m = 0 ∨ m = 1); (s)
fle-01:  ⊦ m ≤ n ∧ n &lt; n0 → m &lt; n0; (forward) from specification nat
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
 ⊦ m ≤ m; (s)
let:  ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ (a ' + x).head = a; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ m &lt; n ↔ ¬ n ≤ m; (ss)
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
 ⊦ a ' + x ≠ []; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="14"><NUM>15</NUM><TYPE>step</TYPE><INFO>User applied rule apply rewrite lemma</INFO><SEQ>&#35; x ≠ 1, leftneighbor(x, xpos0) ≠ first-lower(xpos0 ' + stack0, x, x[xpos0]), x ≠ [], xpos0 ≠ 0, xpos0 &lt; &#35; x, bounded(stack0, 1, xpos0 + 1), 
ordered&gt;(xpos0 ' + stack0), valid-stack(xpos0 ' + stack0, x), 1 ≤ xpos0
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>16</FST><SND><SEQ>xpos &lt; &#35; x ⊦ valid-stack(xpos ' + stack, x) → first-lower(xpos ' + stack, x, x[xpos]) = leftneighbor(x, xpos)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: &lt;toplevel&gt;, name:valid-stack-leftneighbor-succ, 
seq:xpos &lt; &#35; x
    ⊦   valid-stack(xpos ' + stack, x)
      → first-lower(xpos ' + stack, x, x[xpos]) = leftneighbor(x, xpos), 
subst:[xpos, stack, x] → [xpos0, stack0, x], &lt;all paths&gt;</RULEARGS><EXTRAS>
Used terms: xpos0, stack0, x</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="15"><NUM>16</NUM><TYPE>lemma</TYPE><INFO>valid-stack-leftneighbor-succ</INFO><SEQ>xpos &lt; &#35; x ⊦ valid-stack(xpos ' + stack, x) → first-lower(xpos ' + stack, x, x[xpos]) = leftneighbor(x, xpos)</SEQ></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="6"><NUM>17</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), 
ordered&gt;(stack), valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, ¬ x[stack.head]! &lt; x[xpos]!, 
stack2 ≠ [] → stack2.head = xpos - 1, stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := stack.tail⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos) ∧ valid-stack(stack, x)
         ∧ leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!))
      ∧ &#35; stack &lt; &#35; stack1)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>18</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), 
ordered&gt;(stack2), valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, ¬ x[stack.head]! &lt; x[xpos]!, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦   (  xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack.tail) ∧ bounded(stack.tail, 1, xpos) ∧ valid-stack(stack.tail, x)
     ∧ leftneighbor(x, xpos - 1) = first-lower(stack.tail, x, x[xpos]!))
  ∧ &#35; stack.tail &lt; &#35; stack1</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="17"><NUM>18</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), 
ordered&gt;(stack2), valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, ¬ x[stack.head]! &lt; x[xpos]!, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦   (  xpos ≠ 0 ∧ xpos ≤ &#35; x ∧ ordered&gt;(stack.tail) ∧ bounded(stack.tail, 1, xpos) ∧ valid-stack(stack.tail, x)
     ∧ leftneighbor(x, xpos - 1) = first-lower(stack.tail, x, x[xpos]!))
  ∧ &#35; stack.tail &lt; &#35; stack1</SEQ><NEWGOALS><LIST><LE><PAIR><FST>19</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos - 1]), stack1.head ≠ 0, stack1 ≠ [], xpos ≠ 0, 
bounded(stack2, 1, xpos), bounded(stack1, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), valid-stack(stack1, x), 
xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack1.head ≤ &#35; x, ¬ x[stack1.head - 1] &lt; x[xpos - 1], xpos ≠ 1 → stack2.head = xpos - 1
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos - 1) = first-lower(stack1.tail, x, x[xpos - 1])</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
one-based-lookup:  ⊦ x[n]! = x[n -1];
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ ¬ a &lt; a; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
n0 ≤ n ⊦ n - n0 &lt; m ↔ n &lt; m + n0; (s)
 ⊦ &#35; x = 0 ↔ x = []; (s)
 ⊦ m &lt; 1 ↔ m = 0; (s)
 ⊦ m ≤ n ↔ ¬ n &lt; m; (ss)
 ⊦ n -1 = n - 1; (s)
 ⊦ x ≠ [] → &#35; x.tail = (&#35; x)-1; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="18"><NUM>19</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos - 1]), stack1.head ≠ 0, stack1 ≠ [], xpos ≠ 0, 
bounded(stack2, 1, xpos), bounded(stack1, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), valid-stack(stack1, x), 
xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack1.head ≤ &#35; x, ¬ x[stack1.head - 1] &lt; x[xpos - 1], xpos ≠ 1 → stack2.head = xpos - 1
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos - 1) = first-lower(stack1.tail, x, x[xpos - 1])</SEQ><NEWGOALS><LIST><LE><PAIR><FST>20</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos0) = first-lower(stack1, x, x[xpos0]), xpos = xpos0 + 1, stack1.head ≠ 0, stack1 ≠ [], xpos ≠ 0, 
bounded(stack1, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), 
stack1.head ≤ &#35; x, xpos ≤ &#35; x, xpos ≤ &#35; x + 1, ¬ x[stack1.head - 1] &lt; x[xpos0], xpos ≠ 1 → stack2.head = xpos0
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos0) = first-lower(stack1.tail, x, x[xpos0])</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: nat, name:elim-pred-c, seq:n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1, 
subst:[n, m] → [xpos, xpos0]</RULEARGS><EXTRAS>Used simplifier rules:
n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim)
Used terms: xpos, m</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="19"><NUM>20</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos0) = first-lower(stack1, x, x[xpos0]), xpos = xpos0 + 1, stack1.head ≠ 0, stack1 ≠ [], xpos ≠ 0, 
bounded(stack1, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), 
stack1.head ≤ &#35; x, xpos ≤ &#35; x, xpos ≤ &#35; x + 1, ¬ x[stack1.head - 1] &lt; x[xpos0], xpos ≠ 1 → stack2.head = xpos0
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos0) = first-lower(stack1.tail, x, x[xpos0])</SEQ><NEWGOALS><LIST><LE><PAIR><FST>21</FST><SND><SEQ>stack2 = [] ↔ xpos0 = 0, leftneighbor(x, xpos0) = first-lower(stack1, x, x[xpos0]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 &lt; &#35; x, 
bounded(stack1, 1, xpos0 + 1), bounded(stack2, 1, xpos0 + 1), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), 
stack1.head ≤ &#35; x, ¬ x[stack1.head - 1] &lt; x[xpos0], xpos0 ≠ 0 → stack2.head = xpos0
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos0 + 1) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos0) = first-lower(stack1.tail, x, x[xpos0])</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ &#35; x = 0 ↔ x = []; (s)
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ m &lt; n → m ≤ n; (s)
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
 ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)
 ⊦ m + 1 ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="20"><NUM>21</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>stack2 = [] ↔ xpos0 = 0, leftneighbor(x, xpos0) = first-lower(stack1, x, x[xpos0]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 &lt; &#35; x, 
bounded(stack1, 1, xpos0 + 1), bounded(stack2, 1, xpos0 + 1), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), 
stack1.head ≤ &#35; x, ¬ x[stack1.head - 1] &lt; x[xpos0], xpos0 ≠ 0 → stack2.head = xpos0
⊦   ordered&gt;(stack1.tail) ∧ bounded(stack1.tail, 1, xpos0 + 1) ∧ valid-stack(stack1.tail, x)
  ∧ leftneighbor(x, xpos0) = first-lower(stack1.tail, x, x[xpos0])</SEQ><NEWGOALS><LIST></LIST></NEWGOALS><RULEARGS>spec: list-data[natlist], name:elim-1, 
seq: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail), 
subst:[x, head, tail] → [stack1, xpos, stack]</RULEARGS><EXTRAS>Used simplifier rules:
first-lower-rec:  ⊦ first-lower(xpos ' + stack, x, a) = (x[xpos]! &lt; a ⊃ xpos;first-lower(stack, x, a));
one-based-lookup:  ⊦ x[n]! = x[n -1];
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
ordered-pop:  ⊦ ordered&gt;(xpos ' + stack) → ordered&gt;(stack);
valid-stack-pop:  ⊦ valid-stack(xpos ' + stack, x) → valid-stack(stack, x);
 ⊦ n -1 = n - 1; (s)
 ⊦ a ' + x ≠ []; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ m &lt; n ↔ ¬ n ≤ m; (ss)
 ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim)
Used terms: stack1, head, tail</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="6"><NUM>22</NUM><TYPE>step</TYPE><INFO>Heuristic conditional right split applied rule if right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), 
valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>23</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), ordered&gt;(stack2), 
valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨lneighbors := lneighbors + 0; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE><LE><PAIR><FST>26</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), ordered&gt;(stack2), 
valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>pos: right 1</RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="22"><NUM>23</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), ordered&gt;(stack2), 
valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨lneighbors := lneighbors + 0; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>24</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), 
valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors + 0 = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="23"><NUM>24</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = [], stack0 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack2, 1, xpos), bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), 
valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors + 0 = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>25</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = xpos + stack1, stack0 = [], stack1 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack1, 1, xpos), bounded(stack2, 1, xpos), 
ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors + 0 = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="24"><NUM>25</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack = xpos + stack1, stack0 = [], stack1 = [], xpos = xpos0, xpos1 = 1, xpos ≠ 0, bounded(stack1, 1, xpos), bounded(stack2, 1, xpos), 
ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors + 0 = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
one-based-lookup:  ⊦ x[n]! = x[n -1];
first-lower-base:  ⊦ first-lower([], x, a) = 0;
valid-stack-base:  ⊦ valid-stack([], x);
ordered-base:  ⊦ ordered&gt;([]);
bounded-base:  ⊦ bounded([], n0, n1);
ordered-one:  ⊦ ordered&gt;(n ');
bounded-one:  ⊦ bounded(m ', n0, n1) ↔ n0 ≤ m ∧ m &lt; n1;
leftneighbors-rec:  ⊦ leftneighbors(x, n + 1) = leftneighbors(x, n) + leftneighbor(x, n);
valid-stack-one:  ⊦ valid-stack(xpos ', x) ↔ 0 &lt; xpos ∧ xpos ≤ &#35; x ∧ leftneighbor(x, xpos - 1) = 0;
 ⊦ n -1 = n - 1; (s)
 ⊦ m + 1 ≠ 0; (s)
 ⊦ n ≤ n0 ∧ n1 ≤ m → n + n1 ≤ n0 + m; (s)
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ x + a = x + a '; (s)
 ⊦ &#35; x = &#35; z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws)
 ⊦ a ' = b ' ↔ a = b; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
 ⊦ a ' ≠ []; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ x + [] = x; (s)
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ a '.head = a; (s)
n ≤ m ⊦ (m - n) + n0 = n1 ↔ m + n0 = n + n1; (s)
 ⊦ m + n - n + n1 = m - n1; (s)
 ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s)
 ⊦ m ≤ n → (n &lt; m ↔ false); (s)
n0 ≤ n ⊦ n - n0 &lt; m ↔ n &lt; m + n0; (s)
 ⊦ n ≤ n0 → (m + (n0 - n)) + n = m + n0; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
 ⊦ ¬ a &lt; a; (s)
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
 ⊦ m ≤ n ↔ ¬ n &lt; m; (ss)
 ⊦ m &lt; 1 ↔ m = 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="22"><NUM>26</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = leftneighbors(x, xpos - 1), lneighbors0 = [], 
stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), bounded(stack2, 1, xpos), ordered&gt;(stack), ordered&gt;(stack2), 
valid-stack(stack, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>27</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = lneighbors1 + stack.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), 
bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, 
stack2 ≠ [] → stack2.head = xpos - 1, stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="26"><NUM>27</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), lneighbors = lneighbors1 + stack.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack0 = [], xpos = xpos0, xpos1 = 1, stack ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), 
bounded(stack, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack), valid-stack(stack2, x), valid-stack(stack, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, 
stack2 ≠ [] → stack2.head = xpos - 1, stack ≠ [] → ((0 &lt; stack.head ∧ stack.head ≤ &#35; x) ∧ stack ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ ⟨stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack ≠ [] ∧ ¬ x[stack.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>28</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = lneighbors1 + stack1.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack = xpos + stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack1 ≠ [], xpos ≠ 0, bounded(stack1, 1, xpos), 
bounded(stack2, 1, xpos), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="27"><NUM>28</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule assign right</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = lneighbors1 + stack1.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack = xpos + stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack1 ≠ [], xpos ≠ 0, bounded(stack1, 1, xpos), 
bounded(stack2, 1, xpos), ordered&gt;(stack1), ordered&gt;(stack2), valid-stack(stack1, x), valid-stack(stack2, x), xpos ≤ &#35; x, xpos ≤ &#35; x + 1, 
stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x, stack2 ≠ [] → stack2.head = xpos - 1
⊦ ⟨xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!</SEQ><NEWGOALS><LIST><LE><PAIR><FST>29</FST><SND><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = lneighbors1 + stack1.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack = xpos + stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack1 ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), 
bounded(stack1, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), valid-stack(stack1, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, 
stack2 ≠ [] → stack2.head = xpos - 1, stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!, 
    (  xpos + 1 ≠ 0 ∧ xpos + 1 ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos + 1 = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos + 1)
     ∧ lneighbors = leftneighbors(x, xpos + 1 - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos + 1 - 1))
  ∧ &#35; x + 1 - xpos + 1 &lt; &#35; x + 1 - xpos0</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="28"><NUM>29</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = [] ↔ xpos = 1, leftneighbor(x, xpos - 1) = first-lower(stack1, x, x[xpos]!), lneighbors = lneighbors1 + stack1.head, lneighbors0 = [], 
lneighbors1 = leftneighbors(x, xpos - 1), stack = xpos + stack1, stack0 = [], xpos = xpos0, xpos1 = 1, stack1 ≠ [], xpos ≠ 0, bounded(stack2, 1, xpos), 
bounded(stack1, 1, xpos), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), valid-stack(stack1, x), xpos ≤ &#35; x + 1, xpos ≤ &#35; x, 
stack2 ≠ [] → stack2.head = xpos - 1, stack1 ≠ [] → ((0 &lt; stack1.head ∧ stack1.head ≤ &#35; x) ∧ stack1 ≠ []) ∧ 0 &lt; xpos ∧ xpos ≤ &#35; x
⊦ stack1 ≠ [] ∧ ¬ x[stack1.head]! &lt; x[xpos]!, 
    (  xpos + 1 ≠ 0 ∧ xpos + 1 ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos + 1 = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos + 1)
     ∧ lneighbors = leftneighbors(x, xpos + 1 - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos + 1 - 1))
  ∧ &#35; x + 1 - xpos + 1 &lt; &#35; x + 1 - xpos0</SEQ><NEWGOALS><LIST><LE><PAIR><FST>30</FST><SND><SEQ>stack2 = [] ↔ xpos0 = 1, leftneighbor(x, xpos0 - 1) = first-lower(stack1, x, x[xpos0 - 1]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
x[stack1.head - 1] &lt; x[xpos0 - 1], bounded(stack2, 1, xpos0), bounded(stack1, 1, xpos0), ordered&gt;(stack2), ordered&gt;(stack1), 
valid-stack(stack2, x), valid-stack(stack1, x), stack1.head ≤ &#35; x, xpos0 ≤ &#35; x + 1, xpos0 ≤ &#35; x, 1 ≤ xpos0, 1 ≤ &#35; x, 
xpos0 ≠ 1 → stack2.head = xpos0 - 1
⊦ valid-stack(xpos0 ' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos0 - 1) ∧ bounded(stack1, 1, xpos0 + 1) ∧ ordered&gt;(xpos0 ' + stack1)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
leftneighbors-rec:  ⊦ leftneighbors(x, n + 1) = leftneighbors(x, n) + leftneighbor(x, n);
one-based-lookup:  ⊦ x[n]! = x[n -1];
 ⊦ &#35; x = 0 ↔ x = []; (s)
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ m ≤ m + n; (s)
let:  ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat
 ⊦ m &lt; 1 ↔ m = 0; (s)
 ⊦ m ≤ n ↔ ¬ n &lt; m; (ss)
 ⊦ n -1 = n - 1; (s)
 ⊦ ¬ a &lt; a; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
 ⊦ n ≤ n0 → (m + (n0 - n)) + n = m + n0; (s)
n0 ≤ n ⊦ n - n0 &lt; m ↔ n &lt; m + n0; (s)
 ⊦ m ≤ n → (n &lt; m ↔ false); (s)
 ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s)
 ⊦ m + n - n + n1 = m - n1; (s)
n ≤ m ⊦ (m - n) + n0 = n1 ↔ m + n0 = n + n1; (s)
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ (a ' + x).head = a; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ a ' + x ≠ []; (s)
 ⊦ a ' = b ' ↔ a = b; (s)
 ⊦ &#35; x = &#35; z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws)
 ⊦ x + a = x + a '; (s)
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ n ≤ n0 ∧ n1 ≤ m → n + n1 ≤ n0 + m; (s)
 ⊦ m + 1 ≠ 0; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="29"><NUM>30</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>stack2 = [] ↔ xpos0 = 1, leftneighbor(x, xpos0 - 1) = first-lower(stack1, x, x[xpos0 - 1]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
x[stack1.head - 1] &lt; x[xpos0 - 1], bounded(stack2, 1, xpos0), bounded(stack1, 1, xpos0), ordered&gt;(stack2), ordered&gt;(stack1), 
valid-stack(stack2, x), valid-stack(stack1, x), stack1.head ≤ &#35; x, xpos0 ≤ &#35; x + 1, xpos0 ≤ &#35; x, 1 ≤ xpos0, 1 ≤ &#35; x, 
xpos0 ≠ 1 → stack2.head = xpos0 - 1
⊦ valid-stack(xpos0 ' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos0 - 1) ∧ bounded(stack1, 1, xpos0 + 1) ∧ ordered&gt;(xpos0 ' + stack1)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>31</FST><SND><SEQ>stack2 = [] ↔ xpos0 = 1, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), xpos0 = xpos + 1, stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
x[stack1.head - 1] &lt; x[xpos], bounded(stack1, 1, xpos0), bounded(stack2, 1, xpos0), ordered&gt;(stack1), ordered&gt;(stack2), 
valid-stack(stack1, x), valid-stack(stack2, x), 1 ≤ &#35; x, 1 ≤ xpos0, xpos0 ≤ &#35; x, xpos0 ≤ &#35; x + 1, stack1.head ≤ &#35; x, 
xpos0 ≠ 1 → stack2.head = xpos
⊦ valid-stack(xpos0 ' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos) ∧ bounded(stack1, 1, xpos0 + 1) ∧ ordered&gt;(xpos0 ' + stack1)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: nat, name:elim-pred-c, seq:n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1, 
subst:[n, m] → [xpos0, xpos]</RULEARGS><EXTRAS>Used simplifier rules:
n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim)
Used terms: xpos0, m</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="30"><NUM>31</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = [] ↔ xpos0 = 1, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), xpos0 = xpos + 1, stack1.head ≠ 0, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
x[stack1.head - 1] &lt; x[xpos], bounded(stack1, 1, xpos0), bounded(stack2, 1, xpos0), ordered&gt;(stack1), ordered&gt;(stack2), 
valid-stack(stack1, x), valid-stack(stack2, x), 1 ≤ &#35; x, 1 ≤ xpos0, xpos0 ≤ &#35; x, xpos0 ≤ &#35; x + 1, stack1.head ≤ &#35; x, 
xpos0 ≠ 1 → stack2.head = xpos
⊦ valid-stack(xpos0 ' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos) ∧ bounded(stack1, 1, xpos0 + 1) ∧ ordered&gt;(xpos0 ' + stack1)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>32</FST><SND><SEQ>stack2 = [] ↔ xpos = 0, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], x[stack1.head - 1] &lt; x[xpos], 
xpos &lt; &#35; x, bounded(stack2, 1, xpos + 1), bounded(stack1, 1, xpos + 1), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), 
valid-stack(stack1, x), 1 ≤ &#35; x, stack1.head ≤ &#35; x, xpos ≠ 0 → stack2.head = xpos
⊦ valid-stack((xpos + 1)' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos) ∧ bounded(stack1, 1, 2 + xpos) ∧ ordered&gt;((xpos + 1)' + stack1)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
 ⊦ 1 = m + 1 ↔ m = 0; (s)
 ⊦ m &lt; n → m ≤ n; (s)
 ⊦ m ≤ m + n; (s)
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
 ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)
 ⊦ m + 1 ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="31"><NUM>32</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>stack2 = [] ↔ xpos = 0, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), stack1.head ≠ 0, stack1 ≠ [], x ≠ [], x[stack1.head - 1] &lt; x[xpos], 
xpos &lt; &#35; x, bounded(stack2, 1, xpos + 1), bounded(stack1, 1, xpos + 1), ordered&gt;(stack2), ordered&gt;(stack1), valid-stack(stack2, x), 
valid-stack(stack1, x), 1 ≤ &#35; x, stack1.head ≤ &#35; x, xpos ≠ 0 → stack2.head = xpos
⊦ valid-stack((xpos + 1)' + stack1, x) ∧ stack1.head = leftneighbor(x, xpos) ∧ bounded(stack1, 1, 2 + xpos) ∧ ordered&gt;((xpos + 1)' + stack1)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>33</FST><SND><SEQ>stack2 = [] ↔ xpos = 0, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), stack1 = xpos0 + stack, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
xpos &lt; &#35; x, x[xpos0 - 1] &lt; x[xpos], bounded(stack1, 1, xpos + 1), bounded(stack2, 1, xpos + 1), ordered&gt;(stack1), ordered&gt;(stack2), 
valid-stack(stack1, x), valid-stack(stack2, x), xpos0 ≤ &#35; x, 1 ≤ &#35; x, xpos ≠ 0 → stack2.head = xpos
⊦ valid-stack((xpos + 1)' + stack1, x) ∧ xpos0 = leftneighbor(x, xpos) ∧ bounded(stack1, 1, 2 + xpos) ∧ ordered&gt;((xpos + 1)' + stack1)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: list-data[natlist], name:elim-1, 
seq: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail), 
subst:[x, head, tail] → [stack1, xpos0, stack]</RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim)
Used terms: stack1, head, tail</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="32"><NUM>33</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = [] ↔ xpos = 0, leftneighbor(x, xpos) = first-lower(stack1, x, x[xpos]), stack1 = xpos0 + stack, stack1 ≠ [], x ≠ [], xpos0 ≠ 0, 
xpos &lt; &#35; x, x[xpos0 - 1] &lt; x[xpos], bounded(stack1, 1, xpos + 1), bounded(stack2, 1, xpos + 1), ordered&gt;(stack1), ordered&gt;(stack2), 
valid-stack(stack1, x), valid-stack(stack2, x), xpos0 ≤ &#35; x, 1 ≤ &#35; x, xpos ≠ 0 → stack2.head = xpos
⊦ valid-stack((xpos + 1)' + stack1, x) ∧ xpos0 = leftneighbor(x, xpos) ∧ bounded(stack1, 1, 2 + xpos) ∧ ordered&gt;((xpos + 1)' + stack1)</SEQ><NEWGOALS><LIST><LE><PAIR><FST>34</FST><SND><SEQ>&#35; x ≠ 1, stack2.head ≠ 0, leftneighbor(x, stack2.head) ≠ 0, stack2 ≠ [], x ≠ [], leftneighbor(x, stack2.head) &lt; &#35; x, 
stack2.head &lt; &#35; x, x[leftneighbor(x, stack2.head) - 1] &lt; x[stack2.head], leftneighbor(x, stack2.head) &lt; 2 + stack2.head, 
bounded(stack, 1, stack2.head + 1), bounded(stack2, 1, stack2.head + 1), ordered&gt;(leftneighbor(x, stack2.head) ' + stack), ordered&gt;(stack2), 
valid-stack(leftneighbor(x, stack2.head) ' + stack, x), valid-stack(stack2, x), 1 ≤ stack2.head, leftneighbor(x, stack2.head) ≤ stack2.head, 
1 ≤ leftneighbor(x, stack2.head), ¬ bounded(stack, 1, 2 + stack2.head)
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
first-lower-rec:  ⊦ first-lower(xpos ' + stack, x, a) = (x[xpos]! &lt; a ⊃ xpos;first-lower(stack, x, a));
one-based-lookup:  ⊦ x[n]! = x[n -1];
valid-stack-rec: ⊦   valid-stack(xpos1 ' + xpos0 ' + stack, x)
  ↔   0 &lt; xpos1 ∧ xpos1 ≤ &#35; x ∧ leftneighbor(x, xpos1 - 1) = xpos0
    ∧ valid-stack(xpos0 ' + stack, x);
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
ordered-rec:  ⊦ ordered&gt;(n0 ' + n1 ' + stack) ↔ n1 &lt; n0 ∧ ordered&gt;(n1 ' + stack);
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
n &lt; n0 ⊦ (* n) ≠ m0 + (* n0); (s)
 ⊦ 1 &lt; m ↔ ¬(m = 0 ∨ m = 1); (s)
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
let:  ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat
fle-01:  ⊦ m ≤ n ∧ n &lt; n0 → m &lt; n0; (forward) from specification nat
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
 ⊦ &#35; x = 0 ↔ x = []; (s)
 ⊦ m ≠ n → (m ≤ n ↔ m &lt; n); (s)
lel:  ⊦ a &lt; b ∧ a = c → c &lt; b; (forward) from specification oelem[natlist]
 ⊦ m + m0 ≤ m ↔ m0 = 0; (s)
 ⊦ m &lt; n ↔ ¬ n ≤ m; (ss)
 ⊦ m &lt; n → m ≤ n; (s)
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ m ≤ n → (n &lt; m ↔ false); (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ n + 0 = n; (s)
 ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s)
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
 ⊦ m + 1 ≠ 0; (s)
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
 ⊦ a ' + x ≠ []; (s)
 ⊦ n -1 = n - 1; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="33"><NUM>34</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>&#35; x ≠ 1, stack2.head ≠ 0, leftneighbor(x, stack2.head) ≠ 0, stack2 ≠ [], x ≠ [], leftneighbor(x, stack2.head) &lt; &#35; x, 
stack2.head &lt; &#35; x, x[leftneighbor(x, stack2.head) - 1] &lt; x[stack2.head], leftneighbor(x, stack2.head) &lt; 2 + stack2.head, 
bounded(stack, 1, stack2.head + 1), bounded(stack2, 1, stack2.head + 1), ordered&gt;(leftneighbor(x, stack2.head) ' + stack), ordered&gt;(stack2), 
valid-stack(leftneighbor(x, stack2.head) ' + stack, x), valid-stack(stack2, x), 1 ≤ stack2.head, leftneighbor(x, stack2.head) ≤ stack2.head, 
1 ≤ leftneighbor(x, stack2.head), ¬ bounded(stack, 1, 2 + stack2.head)
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>35</FST><SND><SEQ>stack2 = xpos + stack0, &#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, stack2 ≠ [], x ≠ [], xpos ≠ 0, leftneighbor(x, xpos) &lt; 2 + xpos, 
x[leftneighbor(x, xpos) - 1] &lt; x[xpos], xpos &lt; &#35; x, leftneighbor(x, xpos) &lt; &#35; x, bounded(stack2, 1, xpos + 1), 
bounded(stack, 1, xpos + 1), ordered&gt;(stack2), ordered&gt;(leftneighbor(x, xpos) ' + stack), valid-stack(stack2, x), 
valid-stack(leftneighbor(x, xpos) ' + stack, x), 1 ≤ leftneighbor(x, xpos), leftneighbor(x, xpos) ≤ xpos, 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: list-data[natlist], name:elim-1, 
seq: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail), 
subst:[x, head, tail] → [stack2, xpos, stack0]</RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim)
Used terms: stack2, head, tail</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="34"><NUM>35</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>stack2 = xpos + stack0, &#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, stack2 ≠ [], x ≠ [], xpos ≠ 0, leftneighbor(x, xpos) &lt; 2 + xpos, 
x[leftneighbor(x, xpos) - 1] &lt; x[xpos], xpos &lt; &#35; x, leftneighbor(x, xpos) &lt; &#35; x, bounded(stack2, 1, xpos + 1), 
bounded(stack, 1, xpos + 1), ordered&gt;(stack2), ordered&gt;(leftneighbor(x, xpos) ' + stack), valid-stack(stack2, x), 
valid-stack(leftneighbor(x, xpos) ' + stack, x), 1 ≤ leftneighbor(x, xpos), leftneighbor(x, xpos) ≤ xpos, 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>36</FST><SND><SEQ>&#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, x ≠ [], xpos ≠ 0, leftneighbor(x, xpos) &lt; &#35; x, leftneighbor(x, xpos) &lt; 2 + xpos, 
x[leftneighbor(x, xpos) - 1] &lt; x[xpos], xpos &lt; &#35; x, bounded(stack0, 1, xpos + 1), bounded(stack, 1, xpos + 1), ordered&gt;(xpos ' + stack0), 
ordered&gt;(leftneighbor(x, xpos) ' + stack), valid-stack(xpos ' + stack0, x), valid-stack(leftneighbor(x, xpos) ' + stack, x), 1 ≤ xpos, 
1 ≤ leftneighbor(x, xpos), leftneighbor(x, xpos) ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
n &lt; n0 ⊦ (* n) ≠ m0 + (* n0); (s)
 ⊦ 1 &lt; m ↔ ¬(m = 0 ∨ m = 1); (s)
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
fle-01:  ⊦ m ≤ n ∧ n &lt; n0 → m &lt; n0; (forward) from specification nat
let:  ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ ¬ a &lt; a; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ a ' + x ≠ []; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="35"><NUM>36</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>&#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, x ≠ [], xpos ≠ 0, leftneighbor(x, xpos) &lt; &#35; x, leftneighbor(x, xpos) &lt; 2 + xpos, 
x[leftneighbor(x, xpos) - 1] &lt; x[xpos], xpos &lt; &#35; x, bounded(stack0, 1, xpos + 1), bounded(stack, 1, xpos + 1), ordered&gt;(xpos ' + stack0), 
ordered&gt;(leftneighbor(x, xpos) ' + stack), valid-stack(xpos ' + stack0, x), valid-stack(leftneighbor(x, xpos) ' + stack, x), 1 ≤ xpos, 
1 ≤ leftneighbor(x, xpos), leftneighbor(x, xpos) ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>37</FST><SND><SEQ>leftneighbor(x, xpos) = xpos0 + 1, &#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, x ≠ [], xpos ≠ 0, xpos &lt; &#35; x, x[xpos0] &lt; x[xpos], 
leftneighbor(x, xpos) &lt; 2 + xpos, leftneighbor(x, xpos) &lt; &#35; x, bounded(stack, 1, xpos + 1), bounded(stack0, 1, xpos + 1), 
ordered&gt;(leftneighbor(x, xpos) ' + stack), ordered&gt;(xpos ' + stack0), valid-stack(leftneighbor(x, xpos) ' + stack, x), 
valid-stack(xpos ' + stack0, x), leftneighbor(x, xpos) ≤ xpos, 1 ≤ leftneighbor(x, xpos), 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: nat, name:elim-pred-c, seq:n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1, 
subst:[n, m] → [leftneighbor(x, xpos), xpos0]</RULEARGS><EXTRAS>Used simplifier rules:
n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim)
Used terms: leftneighbor(x, xpos), m</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="36"><NUM>37</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>leftneighbor(x, xpos) = xpos0 + 1, &#35; x ≠ 1, leftneighbor(x, xpos) ≠ 0, x ≠ [], xpos ≠ 0, xpos &lt; &#35; x, x[xpos0] &lt; x[xpos], 
leftneighbor(x, xpos) &lt; 2 + xpos, leftneighbor(x, xpos) &lt; &#35; x, bounded(stack, 1, xpos + 1), bounded(stack0, 1, xpos + 1), 
ordered&gt;(leftneighbor(x, xpos) ' + stack), ordered&gt;(xpos ' + stack0), valid-stack(leftneighbor(x, xpos) ' + stack, x), 
valid-stack(xpos ' + stack0, x), leftneighbor(x, xpos) ≤ xpos, 1 ≤ leftneighbor(x, xpos), 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>38</FST><SND><SEQ>leftneighbor(x, xpos) = xpos0 + 1, &#35; x ≠ 1, x ≠ [], x[xpos0] &lt; x[xpos], xpos &lt; &#35; x, xpos0 &lt; xpos, xpos0 + 1 &lt; &#35; x, 
xpos0 &lt; &#35; x, bounded(stack0, 1, xpos + 1), bounded(stack, 1, xpos + 1), ordered&gt;(xpos ' + stack0), ordered&gt;((xpos0 + 1)' + stack), 
valid-stack(xpos ' + stack0, x), valid-stack((xpos0 + 1)' + stack, x), 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
eqle-one:  ⊦ m = n + 1 ∧ n &lt; n0 → m ≤ n0; (forward) from specification nat
 ⊦ a &lt; b → (b &lt; a ↔ false); (ss)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
n &lt; n0 ⊦ m + (* n) &lt; m0 + (* n0) ↔ m &lt; m0 + (n0 - n); (s)
 ⊦ m +1 = m + 1; (s)
lf:  ⊦ m &lt; n ∧ n &lt; n0 → m +1 &lt; n0; (forward) from specification nat-basic
transitivity:  ⊦ a &lt; b ∧ b &lt; c → a &lt; c; (forward) from specification oelem[natlist]
 ⊦ m ≤ m + n; (s)
 ⊦ m &lt; n → n ≠ 0; (s)
 ⊦ m + 1 ≠ 0; (s)
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
fle-01:  ⊦ m ≤ n ∧ n &lt; n0 → m &lt; n0; (forward) from specification nat
lel:  ⊦ a &lt; b ∧ a = c → c &lt; b; (forward) from specification oelem[natlist]</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="37"><NUM>38</NUM><TYPE>step</TYPE><INFO>User applied rule apply lemma</INFO><SEQ>leftneighbor(x, xpos) = xpos0 + 1, &#35; x ≠ 1, x ≠ [], x[xpos0] &lt; x[xpos], xpos &lt; &#35; x, xpos0 &lt; xpos, xpos0 + 1 &lt; &#35; x, 
xpos0 &lt; &#35; x, bounded(stack0, 1, xpos + 1), bounded(stack, 1, xpos + 1), ordered&gt;(xpos ' + stack0), ordered&gt;((xpos0 + 1)' + stack), 
valid-stack(xpos ' + stack0, x), valid-stack((xpos0 + 1)' + stack, x), 1 ≤ xpos, ¬ bounded(stack, 1, 2 + xpos)
⊦ </SEQ><NEWGOALS><LIST><LE><PAIR><FST>39</FST><SND><SEQ> ⊦ bounded(stack, n, m) → bounded(stack, n, m + 1)</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: &lt;toplevel&gt;, name:bounded-succ, 
seq: ⊦ bounded(stack, n, m) → bounded(stack, n, m + 1), 
subst:[stack, n, m] → [stack, 1, xpos + 1]</RULEARGS><EXTRAS>Used simplifier rules:
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
Used terms: stack, 1, xpos + 1</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="38"><NUM>39</NUM><TYPE>lemma</TYPE><INFO>bounded-succ</INFO><SEQ> ⊦ bounded(stack, n, m) → bounded(stack, n, m + 1)</SEQ></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="6"><NUM>40</NUM><TYPE>step</TYPE><INFO>Heuristic symbolic execution applied rule throw right</INFO><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), 
xpos ≤ &#35; x
⊦ ⟨throw ]!; if stack = [] then lneighbors := lneighbors + 0 else lneighbors := lneighbors + stack.head; stack := xpos + stack; xpos := xpos + 1⟩ 
     (  (  xpos ≠ 0 ∧ xpos ≤ &#35; x + 1 ∧ (stack = [] ↔ xpos = 1) ∧ ordered&gt;(stack) ∧ bounded(stack, 1, xpos)
         ∧ lneighbors = leftneighbors(x, xpos - 1) ∧ valid-stack(stack, x) ∧ (stack ≠ [] → stack.head = xpos - 1))
      ∧ &#35; x + 1 - xpos &lt; &#35; x + 1 - xpos0), 
  0 &lt; stack.head ∧ stack.head ≤ &#35; x</SEQ><NEWGOALS><LIST><LE><PAIR><FST>41</FST><SND><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), 
xpos ≤ &#35; x
⊦ 0 &lt; stack.head ∧ stack.head ≤ &#35; x</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS></EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="40"><NUM>41</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos]!), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), valid-stack(stack, x), 
xpos ≤ &#35; x
⊦ 0 &lt; stack.head ∧ stack.head ≤ &#35; x</SEQ><NEWGOALS><LIST><LE><PAIR><FST>42</FST><SND><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos - 1]), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
one-based-lookup:  ⊦ x[n]! = x[n -1];
 ⊦ 0 &lt; m ↔ m ≠ 0; (s)
 ⊦ n -1 = n - 1; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="41"><NUM>42</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>leftneighbor(x, xpos - 1) = first-lower(stack, x, x[xpos - 1]), stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ><NEWGOALS><LIST><LE><PAIR><FST>43</FST><SND><SEQ>leftneighbor(x, xpos0) = first-lower(stack, x, x[xpos0]), xpos = xpos0 + 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS>spec: nat, name:elim-pred-c, seq:n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1, 
subst:[n, m] → [xpos, xpos0]</RULEARGS><EXTRAS>Used simplifier rules:
n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim)
Used terms: xpos, m</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="42"><NUM>43</NUM><TYPE>step</TYPE><INFO>Heuristic simplifier applied rule simplifier</INFO><SEQ>leftneighbor(x, xpos0) = first-lower(stack, x, x[xpos0]), xpos = xpos0 + 1, stack ≠ [], xpos ≠ 0, bounded(stack, 1, xpos), ordered&gt;(stack), 
valid-stack(stack, x), xpos ≤ &#35; x
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ><NEWGOALS><LIST><LE><PAIR><FST>44</FST><SND><SEQ>leftneighbor(x, xpos0) = first-lower(stack, x, x[xpos0]), stack ≠ [], x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), ordered&gt;(stack), 
valid-stack(stack, x)
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ></SND></PAIR></LE></LIST></NEWGOALS><RULEARGS></RULEARGS><EXTRAS>Used simplifier rules:
 ⊦ &#35; x = 0 ↔ x = []; (s)
f:  ⊦ m &lt; n → n ≠ 0; (forward) from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
 ⊦ m + 1 ≤ n ↔ m &lt; n; (s)
 ⊦ m + 1 ≠ 0; (s)</EXTRAS></PROOFNODE><PROOFNODE proofname="LEFTNEIGHBORS-correct" previous="43"><NUM>44</NUM><TYPE>step</TYPE><INFO>Heuristic elimination applied rule apply elim lemma</INFO><SEQ>leftneighbor(x, xpos0) = first-lower(stack, x, x[xpos0]), stack ≠ [], x ≠ [], xpos0 &lt; &#35; x, bounded(stack, 1, xpos0 + 1), ordered&gt;(stack), 
valid-stack(stack, x)
⊦ stack.head ≠ 0 ∧ stack.head ≤ &#35; x</SEQ><NEWGOALS><LIST></LIST></NEWGOALS><RULEARGS>spec: list-data[natlist], name:elim-1, 
seq: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail), 
subst:[x, head, tail] → [stack, xpos, stack0]</RULEARGS><EXTRAS>Used simplifier rules:
first-lower-rec:  ⊦ first-lower(xpos ' + stack, x, a) = (x[xpos]! &lt; a ⊃ xpos;first-lower(stack, x, a));
one-based-lookup:  ⊦ x[n]! = x[n -1];
bounded-rec:  ⊦ bounded(m ' + stack, n0, n1) ↔ n0 ≤ m ∧ m &lt; n1 ∧ bounded(stack, n0, n1);
 ⊦ n -1 = n - 1; (s)
 ⊦ a ' + x ≠ []; (s)
 ⊦ a + x = a ' + x; (s)
 ⊦ m &lt; n + 1 ↔ ¬ n &lt; m; (s)
a:  ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
c:  ⊦ m + n = n + m; from specification nat-basic
a:  ⊦ (x + y) + z = x + y + z; from specification list[natlist]
 ⊦ m &lt; n ↔ ¬ n ≤ m; (ss)
fle-01:  ⊦ m ≤ n ∧ n &lt; n0 → m &lt; n0; (forward) from specification nat
not-zero: 0 &lt; n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat
let:  ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat
 ⊦ m &lt; n → m ≤ n; (s)
 ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim)
Used terms: stack, head, tail</EXTRAS></PROOFNODE></LIST></PROOF></COORDINATES>