anchor.diff:    //if debug then
     //  printfn "random expressions:\n%s\n" (nodesListToString printer (List.rev revertedResult))
     let best = List.minBy snd revertedResult
  -  reporter.finish revertedResult best
  +  reporter.finish (revertedResult |> List.length) best
     best
   
   exception CurrentListReturn of (double) list
  
positive.code:   let completeReporter<'a> (printer: 'a -> string) (logger: Logger) =
      { init = fun msg -> logger msg;
        step = fun stp ruleIdx rulesSize (node, cost) -> logger (sprintf "Step %d, rule %d out of %d: %s" stp ruleIdx rulesSize (nodeCostToString printer node cost))
        finish = fun allPrograms (node, cost) -> logger (sprintf "examined programs: %d\nBest: %s" (List.length allPrograms) (nodeCostToString printer node cost))
      }
  
  open Logging
  
negative.code:     { 
        init: string -> unit; 
        step: int -> int -> int -> ('a * double) -> unit;  // Step#, Rule index, Rules#, NodeCost
        finish: int -> ('a * double) -> unit // # of Examined nodes, Best NodeCost
      }
    
    type Logger = string -> unit
  