
{lst <> 0 /\ tmp == first /\ tmp <> 0 /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> 0) ** (last+1 |-> data) ** 
(elem |->_) ** (elem+1 |->_)}

                [elem+0] := 0

{lst <> 0 /\ tmp == first /\ tmp <> 0 /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> 0) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}





{lst <> 0 /\ tmp == first /\ tmp <> 0 /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> 0) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}

                tmp := [lst+2]

{tmp == last /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> 0) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}





{tmp == last /\ first > 0 /\ current > 0 /\ last > 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> 0) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}

                [tmp+0] := elem

{tmp == last /\ first > 0 /\ current > 0 /\ last > 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> elem) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}



{tmp == last /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> elem) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |->_)}

                [elem+1] := data2

{tmp == last /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> elem) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |-> data2)}

(tmp == last /\ first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> last) ** 
(list first current) ** (list current last) ** (last |-> elem) ** (last+1 |-> data) ** 
(elem |-> 0) ** (elem+1 |-> data2)) |-
(first <> 0 /\ current <> 0 /\ last <> 0 | 
(lst |-> first) ** (lst+1 |-> current) ** (lst+2 |-> elem) ** 
(list first current) ** (list current elem) ** 
(elem |-> 0) ** (elem+1 |-> data2))
