(* ||M|| This file is part of HELM, an Hypertextual, Electronic ||A|| Library of Mathematics, developed at the Computer Science ||T|| Department, University of Bologna, Italy. ||I|| ||T|| HELM is free software; you can redistribute it and/or ||A|| modify it under the terms of the GNU General Public License \ / version 2 or (at your option) any later version. \ / This software is distributed as is, NO WARRANTY. V_______________________________________________________________ *) module P = Printf module C = Cps module L = Log module A = Aut module R = AutProcess type counters = { sections: int; contexts: int; blocks: int; decls: int; defs: int; sorts: int; grefs: int; appls: int; absts: int; pars: int; xnodes: int } let initial_counters = { sections = 0; contexts = 0; blocks = 0; decls = 0; defs = 0; sorts = 0; grefs = 0; appls = 0; absts = 0; pars = 0; xnodes = 0 } let rec count_term f c = function | A.Sort _ -> f {c with sorts = succ c.sorts; xnodes = succ c.xnodes} | A.GRef (_, ts) -> let c = {c with grefs = succ c.grefs} in let c = {c with pars = c.pars + List.length ts} in let c = {c with xnodes = succ c.xnodes + List.length ts} in C.list_fold_left f count_term c ts | A.Appl (v, t) -> let c = {c with appls = succ c.appls; xnodes = succ c.xnodes} in let f c = count_term f c t in count_term f c v | A.Abst (_, w, t) -> let c = {c with absts = succ c.absts; xnodes = succ c.xnodes} in let f c = count_term f c t in count_term f c w let count_entity f c = function | A.Section _ -> f {c with sections = succ c.sections} | A.Context _ -> f {c with contexts = succ c.contexts} | A.Block (_, w) -> let c = {c with blocks = succ c.blocks; xnodes = succ c.xnodes} in count_term f c w | A.Decl (_, w) -> let c = {c with decls = succ c.decls; xnodes = succ c.xnodes} in count_term f c w | A.Def (_, w, _, t) -> let c = {c with defs = succ c.defs; xnodes = succ c.xnodes} in let f c = count_term f c t in count_term f c w let print_counters f c = let terms = c.sorts + c.grefs + c.appls + c.absts in let entities = c.sections + c.contexts + c.blocks + c.decls + c.defs in L.warn (P.sprintf " Automath representation summary"); L.warn (P.sprintf " Total book entities: %7u" entities); L.warn (P.sprintf " Section entities: %7u" c.sections); L.warn (P.sprintf " Context entities: %7u" c.contexts); L.warn (P.sprintf " Block entities: %7u" c.blocks); L.warn (P.sprintf " Declaration entities: %7u" c.decls); L.warn (P.sprintf " Definition entities: %7u" c.defs); L.warn (P.sprintf " Total Parameter items: %7u" c.pars); L.warn (P.sprintf " Application items: %7u" c.pars); L.warn (P.sprintf " Total term items: %7u" terms); L.warn (P.sprintf " Sort items: %7u" c.sorts); L.warn (P.sprintf " Reference items: %7u" c.grefs); L.warn (P.sprintf " Application items: %7u" c.appls); L.warn (P.sprintf " Abstraction items: %7u" c.absts); L.warn (P.sprintf " Global Int. Complexity: unknown"); L.warn (P.sprintf " + Abbreviation nodes: %7u" c.xnodes); f () let print_process_counters f c = let f iao iar iac iag = L.warn (P.sprintf " Automath process summary"); L.warn (P.sprintf " Implicit after opening: %7u" iao); L.warn (P.sprintf " Implicit after reopening: %7u" iar); L.warn (P.sprintf " Implicit after closing: %7u" iac); L.warn (P.sprintf " Implicit after global: %7u" iag); f () in R.get_counters f c