What do you think about expressing the loop invariant as as nested pure 
function?

something like this:

body
{
    Node* p = list_header; // pointer to the current Node
    Node* pp; // pointer to the precedent Node

    pure void checkInvariant(in Node* _pp,
                             in Node* _p,
                             in Node* _list_header,
                             in Node* _nptr)
    {
        // predecessor relation
        assert((_pp == null && _p == _list_header) || (_pp != null && 
_pp.next == _p));

        // predecessor before data
        assert(_pp == null || _pp.data < _nptr.data);

        // current before data
        assert(_p == null || _p.data < _nptr.data); // extra

        // data less than
        // forall k : rowList @ row .. pp :: k.column < column
        debug { // slow
            if (_pp != null && _list_header != _pp) {
                assert(_list_header.data < _nptr.data);
                const(Node)* _pk = _list_header.next;
                while (_pk != _pp) {
                    assert(_pk.data < _nptr.data);
                    _pk = _pk.next;
                }
            }
        }
    }

    while (p != null && p.data < nptr.data) {
        checkInvariant(pp,p,list_header,nptr);

        pp = p;
        p = p.next;
    }

    assert((pp == null && p == list_header) || (pp != null && pp.next == p));
    assert(pp == null || pp.data < nptr.data);

    if (pp != null)
        pp.next = nptr;
    else
        list_header = nptr;
    nptr.next = p;
}

Reply via email to