anchor.diff:          new (d, a) = {Dest = d; Ast = a}
       end
   
  -let inline treeCompare (ast1 : obj) (ast2 : obj) inputLength =
  -    let mutable result = false
  -    let mutable leftChild1 = None
  -    let mutable rightChild1 = None
  -    let mutable leftChild2 = None
  -    let mutable rightChild2 = None
  -    let ext1, prod1 =
  -        match ast1 with
  -        | :? AST as a -> Some(a.leftExt, a.rightExt), a.first.prod
  -        | :? IntermidiateNode as i -> Some i.Extention, fst i.Position
  -        | _ -> None,0
  -    let ext2, prod2 =
  -        match ast2 with
  -        | :? AST as a -> Some(a.leftExt, a.rightExt), a.first.prod
  -        | :? IntermidiateNode as i -> Some i.Extention, fst i.Position
  -        | _ -> None,0
  -    
  -    //if fst ext1.Value = 0 && snd ext1.Value = inputLength  && fst ext2.Value = 0 && snd ext2.Value = inputLength then result <- false
  -    if ext1 = ext2 && prod1 = prod2
  -    then
  -        result <- true
  -    result
  -
   type Context =
       val Index         : int
       val Label         : Label
  
positive.code:     val Ast           : obj
      static member Equal1 (label1 : Label) (node1 : Vertex) (ast1 : obj) (label2 : Label) (node2 : Vertex) (ast2 : obj) inputLength =
          let mutable result = false
          if Label.Equal1 label1 label2 && Vertex.Equal node1 node2 && (*(treeCompare ast1 ast2 inputLength)*) ast1.Equals ast2 then result <- true
          result
      static member Equal2 (label1 : (int*int)) (node1 : Vertex) (ast1 : obj) (label2 : Label) (node2 : Vertex) (ast2 : obj) inputLength =
          let mutable result = false
          if Label.Equal2 label1 label2 && Vertex.Equal node1 node2 (*(treeCompare ast1 ast2 inputLength)*) 
          then 
              if ast1 = null && ast2 = null
              then result <- true
  
negative.code:         if not <| levels.ContainsKey u.Level then levels.[u.Level] <- [!curNum]
          else
              levels.[u.Level] <- !curNum :: levels.[u.Level]
          let labelStr = u.Value.labelToString()
          print <| sprintf "%d [label=\"%s, %d\"]" !curNum  labelStr u.Level
          incr curNum
          if u.OutEdges.first <> Unchecked.defaultof<_> 
          then 
  