let iter ?on_environment ?on_function ?on_behavior ?on_goal () =
  begin
    match on_environment with
      | None -> ()
      | Some phi ->
          Imap.iter 
            (fun m k -> 
               for i = 1 to k do
                 phi (env_name m i)
               done
            system.environments
  end ;
  if on_function <> None || on_behavior <> None || on_goal <> None
  then
    Kfmap.iter
      (fun kf bmap ->
        if (on_behavior <> None || on_goal <> None&&
          not (Imap.is_empty bmap)
        then
          begin
            ( match on_function with
                | None -> ()
                | Some phi -> phi kf ) ;
            Imap.iter
              (fun b pset ->
                 if not (WPOset.is_empty pset) then
                   begin
                     ( match on_behavior with
                         | None -> ()
                         | Some phi ->
                             phi kf (if b="" then None else Some b) ) ;
                     match on_goal with
                       | None -> ()
                       | Some f -> WPOset.iter f pset
                   end
              ) bmap
          end)
      system.index