Structure constrFamiliesLib


Source File Identifier index Theory binding index

signature constrFamiliesLib =
sig
  include Abbrev


  (**********************)
  (* Constructors       *)
  (**********************)

  (* A constructor is a combination of a term with
     a list of names for all it's arguments *)
  type constructor

  (* [mk_constructor c arg_names] generate a constructor [c]
     with argument names [arg_names] *)
  val mk_constructor : term -> string list -> constructor

  (* check whether a constructor has no arguments *)
  val constructor_is_const : constructor -> bool

  (* [mk_constructor_term vs constr] construct a term
     corresponding to [constr]. For the arguments
     variables are generated. These variables are
     distinct from the ones provided in the argument [vs].
     The resulting term as well the used argument vars are
     returned. *)
  val mk_constructor_term : term list -> constructor -> (term * term list)
  (* [match_constructor constr t] tries destruct [t] as a constructor
     of [constr]. It returns NONE, if there is no match. Otherwise
     the main constructor functions + labelled args. *)
  val match_constructor : constructor -> term ->
                          (term * (string * term) list) option

  (* We usually consider lists of constructors. It is an abstract
     type that should only be used via [make_constructorList]. *)
  type constructorList

  (* [mk_constructorList exh constrs] makes a new constructorList.
     [exh] states whether the list is exhaustive, i.e. wether all values
     of the type can be constructed  via a constructor in this list *)
  val mk_constructorList : bool -> constructor list -> constructorList

  (* [make_constructorList exh constrs] is a convenience functions
     that maps [mk_constructor] over constrs before calling
     [mk_constructorList]. *)
  val make_constructorList : bool -> (term * string list) list ->
                             constructorList

  (************************)
  (* Constructor Families *)
  (************************)

  (* a constructor family is a list of constructors,
     a case-split function and various theorems *)
  type constructorFamily

  (* Get the rewrites stored in a constructor family, these
     are theorems that use that all constructors are distinct
     to each other and injective. *)
  val constructorFamily_get_rewrites : constructorFamily -> thm

  (* Get the case-cong stored in a constructor family. *)
  val constructorFamily_get_case_cong : constructorFamily -> thm

  (* Get the ssfrag resulting form all the stuff
     in a constructor family. *)
  val constructorFamily_get_ssfrag : constructorFamily -> simpLib.ssfrag

  (* Get the case-split theorem for the family. *)
  val constructorFamily_get_case_split : constructorFamily -> thm

  (* If the constructor family is exhaustive, a theorem stating
     this exhaustiveness. *)
  val constructorFamily_get_nchotomy_thm_opt : constructorFamily -> thm option

  (* Get the constructors of the family. *)
  val constructorFamily_get_constructors : constructorFamily ->
                                           bool * (term * string list) list

  (* [mk_constructorFamily (constrL, case_split_tm, tac)]
     make a new constructor family. It consists of the constructors
     [constrL], the case split constant [case_split_tm]. The
     resulting proof obligations are proofed by tactic [tac]. *)
  val mk_constructorFamily : constructorList * term * tactic ->
                             constructorFamily

  (* [get_constructorFamily_proofObligations] returns the
     proof obligations that occur when creating a new constructor family
     via [mk_constructorFamily]. *)
  val get_constructorFamily_proofObligations : constructorList * term -> term

  (* [set_constructorFamily] sets the proof obligations that occur when
     ruung [mk_constructorFamily] using goalStack. *)
  val set_constructorFamily : constructorList * term -> Manager.proofs

  (* [constructorFamily_of_typebase ty] extracts the constructor family
     for the given type [ty] from typebase. *)
  val constructorFamily_of_typebase : hol_type -> constructorFamily


  (************************)
  (* Compile DBs          *)
  (************************)

  (* A compile database combines constructor families,
     an ssfrag and arbitrary compilation funs. *)


  (* A compilation fun gets a column, i.e. a list of
     terms together with a list of free variables in this term.
     For this column a expansion theorem of the form
     ``!ff x. ff x = ...``, the number of  cases in this expansion
     theorem and an ssfrag should be returned. *)
  type pmatch_compile_fun =
       (term list * term) list -> (thm * int * simpLib.ssfrag) option

  (* A compilation fun gets a column, i.e. a list of
     terms together with a list of free variables in this term.
     For this column an nchotomy theorem as well as the number of
     entries in this nchotomy should be returned. *)
  type pmatch_nchotomy_fun = (term list * term) list -> (thm * int) option

  (* A database for pattern compilation *)
  type pmatch_compile_db = {
    pcdb_compile_funs  : pmatch_compile_fun list,
    pcdb_nchotomy_funs : pmatch_nchotomy_fun list,
    pcdb_constrFams    : (constructorFamily list) TypeNet.typenet,
    pcdb_ss            : simpLib.ssfrag
  }

  (* empty db *)
  val empty : pmatch_compile_db

  (* a default db implemented as a reference *)
  val thePmatchCompileDB : pmatch_compile_db ref

  (* A database represents essentially a compile fun.
     This functions combines all the contents of a db to
     turn it into a compile fun.  *)
  val pmatch_compile_db_compile : pmatch_compile_db -> pmatch_compile_fun
  (* This tries to find the family used by a call to
     [pmatch_compile_db_compile]. If this call picks a
     use a hand-written compile-fun, [NONE] is returned. Similarly,
     if no constructor family is found for this column. *)
  val pmatch_compile_db_compile_cf : pmatch_compile_db ->
     (term list * term) list -> constructorFamily option

  (* This tries to find an nchotony theorem for the given column. *)
  val pmatch_compile_db_compile_nchotomy : pmatch_compile_db ->
     (term list * term) list -> thm option

  (* This tries to destruct a term as a destructor. It looks
     up in the given DB all possible constructors and tries to
     apply match_constructor. *)
  val pmatch_compile_db_dest_constr_term : pmatch_compile_db ->
     term -> (term * (string * term) list) option

  (* add a compile fun to a db *)
  val pmatch_compile_db_add_compile_fun :
     pmatch_compile_db -> pmatch_compile_fun -> pmatch_compile_db

  (* add an nchotomy fun to a db *)
  val pmatch_compile_db_add_nchotomy_fun :
     pmatch_compile_db -> pmatch_nchotomy_fun -> pmatch_compile_db

  (* add a constructorFamily to a db *)
  val pmatch_compile_db_add_constrFam :
     pmatch_compile_db -> constructorFamily -> pmatch_compile_db

  (* add a ssfrag to a db *)
  val pmatch_compile_db_add_ssfrag :
     pmatch_compile_db -> simpLib.ssfrag -> pmatch_compile_db

  (* add a congruence rules to a db *)
  val pmatch_compile_db_add_congs : pmatch_compile_db -> thm list ->
                                    pmatch_compile_db

  (* removes all information for type from a db *)
  val pmatch_compile_db_remove_type : pmatch_compile_db -> hol_type ->
                                      pmatch_compile_db

  (* add a compile_fun to default db *)
  val pmatch_compile_db_register_compile_fun : pmatch_compile_fun -> unit

  (* add a nchotomy_fun to default db *)
  val pmatch_compile_db_register_nchotomy_fun : pmatch_nchotomy_fun -> unit

  (* add a constructor family to default db *)
  val pmatch_compile_db_register_constrFam : constructorFamily -> unit

  (* add a ssfrag to default db *)
  val pmatch_compile_db_register_ssfrag : simpLib.ssfrag -> unit

  (* add a congruence rules to default db *)
  val pmatch_compile_db_register_congs : thm list -> unit

  (* removes all information for type from default db *)
  val pmatch_compile_db_clear_type : hol_type -> unit


  (************************)
  (* Compile Funs         *)
  (************************)

  (* Compilation fun that turns a column of literals into
     a large if-then-else case distinction. It is
     present automatically in the default db. *)
  val literals_compile_fun : pmatch_compile_fun

end


Source File Identifier index Theory binding index

HOL 4, Kananaskis-14