anchor.diff:                                                                         
   let recognitionTable (rules,_) (s:string) = 
              
  -   let recTable = Microsoft.FSharp.Collections.Array2D.create s.Length s.Length ([],(0,0),(0,0),[]) 
  +   let recTable = Microsoft.FSharp.Collections.Array2D.create s.Length s.Length ([],(0,0),(0,0),[])
      //recTable(i,l), для l > 0
   
      let inline processRule rule i k l =
  
positive.code:          match currentRule with
           |ToBranch(_,left,right) -> left,right
           |ToLeaf(_,terminal)     -> terminal.ToString(),""  
        match (i,l) with 
        |(_,0) -> [ToLeaf(top,leftNT.[0])]
        |_     -> currentRule::(subRecognize leftI leftL leftNT)@(subRecognize rightI rightL rightNT)
     let resultRules = if List.exists ((=)start) ((fun (a,_,_,_) -> a) recTable.[0,s.Length-1])
                       then subRecognize 0 (s.Length-1) start//если цепочка принадлежит языку L(g)
                       else []
  
     System.Console.WriteLine(s)
     System.Console.WriteLine("Rules:")
     printRules resultRules
     //printOutput resultRules start    
  
  
negative.code:    |ToLeaf of string*char//A->a, а - терминал
  
  //Вывод правил
  let printRules =
     (function
     | ToBranch(a,b,c) -> System.Console.WriteLine(String.concat "" [a;"->";b;c])                 
     | ToLeaf(a,b)     -> System.Console.WriteLine(String.concat "" [a;"->";b.ToString()]))
     |> List.iter
  
  //Последовательное применение правил rs, начиная с первого левого нетерминала start                             
  let printOutput rs start =
  