anchor.diff:  
   and parse = 
       memoize (fun (q,i) -> 
  -    if debug  then print_parse q (_print());    
  +    if debug  then print_parse q i;    
       union_all
  -        [map (fun x -> x )(Set.filter (fun(Item(a,lst)) -> (List.hd (List.rev lst)) = Dot(' ',1))q)
  -         ;if (let p = get()in p = '$') then empty else (let x = get () in _next();climb (q,  (*(List.hd i)*)x,i-1))
  +        [map (fun x -> (x,i) )(Set.filter (fun(Item(a,lst)) -> (List.hd (List.rev lst)) = Dot(' ',1))q)
  +         ;if (let p = get(i)in p = '$') then empty else (let x = get (i) in (*_next()*)climb (q,  (*(List.hd i)*)x,i-1))
            ;union_from_Some[for (Item(a,lst)) in Q -> match lst 
                                                       with
                                                       | NTerm('`')::[]->Some (climb (q, a,i))
  
positive.code: 
  let rec climb =
      memoize (fun (q,x,i) -> 
      if debug then print_climb_1 (_print()) x q;
      if q = empty
      then empty
      else
  
negative.code:     let new_q = parse (gt,i)
      in 
      if debug then print_climb_3 new_q;
      if Set.exists (fun x->x = (Item('S',[NTerm('E');Dot(' ',1)]),1))new_q
      then new_q
      else    
      Set.union_all                            
      [Set.filter (fun x1-> 
                     Set.exists (fun (Item(ch,lst) as y) -> 
                                     (ItNext y) = fst x1
                                     &&(function Dot(_)::tl-> false
                                                |[]        -> false
                                                | _        -> true)lst
                                 )q)new_q
       |>Set.map (fun x1->((ItPrev (fst x1),snd x1)))                      
      
      ;
      Set.union_all(
      union_from_Some[for (Item(a,hd::tl),i) in new_q -> 
                          if getText hd (1,1,1)=x && (a<>'S')&&(function Dot(_)::tl->true | _ -> false)tl
                          then Some(climb (q,a,i))
                          else None])
  