anchor.diff:      new (head, prefix : Prefix) =
           let curLevel = new ResizeArray<Prefix>()
           curLevel.Add(prefix)
  -        new Prefix (head, curLevel, prefix.Height + 1)
  -
  -    new (head, tail : ResizeArray<Prefix>) =
  -        if ResizeArray.isEmpty(tail)
  -        then new Prefix (head, tail, 1)
  -        else
  -            let mutable maxHeight = 0
  -            let heights = ResizeArray.map (fun (prefix:Prefix) -> if prefix = null then 0 else prefix.Height) tail
  -            for h in heights do
  -                if h > maxHeight
  -                then maxHeight <- h
  -
  -            new Prefix (head, tail, maxHeight + 1)
  -
  -    new (edge) = new Prefix (edge, new ResizeArray<Prefix>(), 1)
  +        new Prefix (head, curLevel)
  +
  +    new (edge) = new Prefix (edge, new ResizeArray<Prefix>())
   
   and [<AllowNullLiteral>]
       Path (head : AstNode, tail : Path, length : int) = 
  
positive.code:                 if ind = -1 || (tailGssV.Edge ind).Ast <> edgesToTerms.[e]
                  then
                      let prefixesToAdd = new ResizeArray<Prefix>()
                      prefixesToAdd.Add(newPrefix gssVertex.prefixes e)           //or edge?
                      addEdge e.Target isNew tailGssV edge true prefixesToAdd    //push case
  
          if not <| currentGraphV.processedGssVertices.Contains(gssVertex)
  
negative.code:     new (_gssVertex, _prod, _pos, _edge) = {gssVertex = _gssVertex; prod = _prod; pos = _pos; edge = _edge}
  
  and [<AllowNullLiteral>]
      Prefix (head : Edge, tail : ResizeArray<Prefix>) = 
  
      member this.Head = head
      member this.Tail = tail
  
      member this.AddEdge edge =
          new Prefix(edge, this)
  