(* ========================================================================== *) (* FLYSPECK - BOOK FORMALIZATION *) (* *) (* Chapter: leg *) (* Author: Thomas C. Hales *) (* Date: 2010-02-10 *) (* ========================================================================== *) (* General utilities. *) module type Flyspeck_utility_type = sig (* looks up all constants first defined in a given file. The file should be specified in the same way as the "flyspeck_needs" statement Also, the first argument is filetable() from build.hl *) val constants_by_file : (string * int) list -> string -> (string * hol_type) list (* inverse lookup *) val file_of_constant : (string * int) list -> string -> string end;; module Flyspeck_utility :Flyspeck_utility_type = struct (* track constants by file *) let rec findpos c a = function [] -> failwith "find" | b::bs -> if Pervasives.compare a b = 0 then c else findpos (c+1) a bs;; let rec sublist t a b = match t with [] -> [] | t0::ts -> if (a>0) then sublist ts (a-1) (b-1) else if (b<=0) then [] else t0::sublist ts 0 (b-1);; let range_by_table c (m:(string*int)list) (s:string) = try( let r = assoc s m in let i = findpos 0 (s,r) m in let start = if (i<=0) then 0 else (let (_,j) = List.nth m (i-1) in j) in sublist c start r) with Failure "find" -> [];; let rec rev_assoc_sorted t i = match t with [] -> failwith "find" | (x,j)::ts -> if (i>=j) then rev_assoc_sorted ts i else x;; let constants_by_file = fun (ftable:(string*int)list) s -> range_by_table (List.rev (constants())) ftable s;; (* Example: constants_by_file "trigonometry/trig1.hl" *) let file_of_constant ftable s = let cs = map fst (List.rev (constants())) in try (let i = findpos 0 s cs in rev_assoc_sorted (List.rev ftable) i) with Failure "find" -> "Constant not located";; (* Example: file_of_constant ftable "packing" *) end;;