anchor.diff:      member this.OutEdges = out
       member this.State = state
       member this.PassingReductions = passingReductions
  -    member val prefixes = new ResizeArray<Path>(4) with get
  +    member val prefixes = new ResizeArray<Prefix>() with get    //in reverse order
   
       member this.addEdge (edge : Edge) =
           let mutable i = out.Count - 1
  
positive.code:                     | _ -> failwith "Unexpected ast"
              for prefix in u.prefixes do
                  prString <-  prString + printPath prefix "["
              print <| sprintf "%d [label=\"%d_%d_%s\"]" !curNum u.Level u.State prString
              incr curNum
              u.OutEdges |> ResizeArray.iter (handleEdge u)
              
  
negative.code:                     addZeroReduction v e.Tag currentGraphV false
          v, isNew
  
      //return old prefixes with new edge on end
      let newPrefix (oldPrefixes:ResizeArray<Prefix>) edge =
          new Prefix(edge, oldPrefixes)
  
      //add prefix to list of prefixes
      let rec addPrefix (curLevel:ResizeArray<Prefix>) (prefixToAdd:Prefix) = 
          if prefixToAdd = null   //null used for marking the ends of prefix
          then
              if not (ResizeArray.exists
                          (fun (prefix:Prefix) -> prefix = null)
                          curLevel)
              then curLevel.Add(null)     //adding null if need
          else
              let nextCommon = ResizeArray.tryFind
                                  (fun (pr:Prefix) -> pr <> null && pr.Head = prefixToAdd.Head)
                                  curLevel
              match nextCommon with
              | Some oldPrefix -> if ResizeArray.isEmpty(prefixToAdd.Tail)
                                  then
                                      addPrefix oldPrefix.Tail null
                                  else
                                      for newPrefix in prefixToAdd.Tail do
                                          addPrefix oldPrefix.Tail newPrefix
              | None -> curLevel.Add(prefixToAdd)     //prefixToAdd - new prefix for curLevel
  
  
      let addEdge (startV:VInfo<_>) isNew (newVertex:Vertex) edge isNotEps (prefixesToAdd:ResizeArray<Prefix>) =
          if not isNew && newVertex.PassingReductions.Count > 0
          then startV.passingReductions.Add((newVertex, edge))
          customEnqueue(startV)
          newVertex.addEdge edge
          for prefixToAdd in prefixesToAdd do
              addPrefix newVertex.prefixes prefixToAdd //add new prefix to vertex
  
          if isNotEps
          then
  