doc-src/Ref/undocumented.tex
author Walther Neuper <neuper@ist.tugraz.at>
Thu, 12 Aug 2010 15:03:34 +0200
branchisac-from-Isabelle2009-2
changeset 37913 20e3616b2d9c
parent 4276 a770eae2cdb0
permissions -rw-r--r--
prepare reactivation of isac-update-Isa09-2
     1 %%%%Currently UNDOCUMENTED low-level functions!  from previous manual
     2 
     3 %%%%Low level information about terms and module Logic.
     4 %%%%Mainly used for implementation of Pure.
     5 
     6 %move to ML sources?
     7 
     8 \subsection{Basic declarations}
     9 The implication symbol is {\tt implies}.
    10 
    11 The term \verb|all T| is the universal quantifier for type {\tt T}\@.
    12 
    13 The term \verb|equals T| is the equality predicate for type {\tt T}\@.
    14 
    15 
    16 There are a number of basic functions on terms and types.
    17 
    18 \index{--->}
    19 \beginprog
    20 op ---> : typ list * typ -> typ
    21 \endprog
    22 Given types \([ \tau_1, \ldots, \tau_n]\) and \(\tau\), it
    23 forms the type \(\tau_1\to \cdots \to (\tau_n\to\tau)\).
    24 
    25 Calling {\prog{}type_of \${t}}\index{type_of} computes the type of the
    26 term~$t$.  Raises exception {\tt TYPE} unless applications are well-typed.
    27 
    28 
    29 Calling \verb|subst_bounds|$([u_{n-1},\ldots,u_0],\,t)$\index{subst_bounds}
    30 substitutes the $u_i$ for loose bound variables in $t$.  This achieves
    31 \(\beta\)-reduction of \(u_{n-1} \cdots u_0\) into $t$, replacing {\tt
    32 Bound~i} with $u_i$.  For \((\lambda x y.t)(u,v)\), the bound variable
    33 indices in $t$ are $x:1$ and $y:0$.  The appropriate call is
    34 \verb|subst_bounds([v,u],t)|.  Loose bound variables $\geq n$ are reduced
    35 by $n$ to compensate for the disappearance of $n$ lambdas.
    36 
    37 \index{maxidx_of_term}
    38 \beginprog
    39 maxidx_of_term: term -> int
    40 \endprog
    41 Computes the maximum index of all the {\tt Var}s in a term.
    42 If there are no {\tt Var}s, the result is \(-1\).
    43 
    44 \index{term_match}
    45 \beginprog
    46 term_match: (term*term)list * term*term -> (term*term)list
    47 \endprog
    48 Calling \verb|term_match(vts,t,u)| instantiates {\tt Var}s in {\tt t} to
    49 match it with {\tt u}.  The resulting list of variable/term pairs extends
    50 {\tt vts}, which is typically empty.  First-order pattern matching is used
    51 to implement meta-level rewriting.
    52 
    53 
    54 \subsection{The representation of object-rules}
    55 The module {\tt Logic} contains operations concerned with inference ---
    56 especially, for constructing and destructing terms that represent
    57 object-rules.
    58 
    59 \index{occs}
    60 \beginprog
    61 op occs: term*term -> bool
    62 \endprog
    63 Does one term occur in the other?
    64 (This is a reflexive relation.)
    65 
    66 \index{add_term_vars}
    67 \beginprog
    68 add_term_vars: term*term list -> term list
    69 \endprog
    70 Accumulates the {\tt Var}s in the term, suppressing duplicates.
    71 The second argument should be the list of {\tt Var}s found so far.
    72 
    73 \index{add_term_frees}
    74 \beginprog
    75 add_term_frees: term*term list -> term list
    76 \endprog
    77 Accumulates the {\tt Free}s in the term, suppressing duplicates.
    78 The second argument should be the list of {\tt Free}s found so far.
    79 
    80 \index{mk_equals}
    81 \beginprog
    82 mk_equals: term*term -> term
    83 \endprog
    84 Given $t$ and $u$ makes the term $t\equiv u$.
    85 
    86 \index{dest_equals}
    87 \beginprog
    88 dest_equals: term -> term*term
    89 \endprog
    90 Given $t\equiv u$ returns the pair $(t,u)$.
    91 
    92 \index{list_implies:}
    93 \beginprog
    94 list_implies: term list * term -> term
    95 \endprog
    96 Given the pair $([\phi_1,\ldots, \phi_m], \phi)$
    97 makes the term \([\phi_1;\ldots; \phi_m] \Imp \phi\).
    98 
    99 \index{strip_imp_prems}
   100 \beginprog
   101 strip_imp_prems: term -> term list
   102 \endprog
   103 Given \([\phi_1;\ldots; \phi_m] \Imp \phi\)
   104 returns the list \([\phi_1,\ldots, \phi_m]\). 
   105 
   106 \index{strip_imp_concl}
   107 \beginprog
   108 strip_imp_concl: term -> term
   109 \endprog
   110 Given \([\phi_1;\ldots; \phi_m] \Imp \phi\)
   111 returns the term \(\phi\). 
   112 
   113 \index{list_equals}
   114 \beginprog
   115 list_equals: (term*term)list * term -> term
   116 \endprog
   117 For adding flex-flex constraints to an object-rule. 
   118 Given $([(t_1,u_1),\ldots, (t_k,u_k)], \phi)$,
   119 makes the term \([t_1\equiv u_1;\ldots; t_k\equiv u_k]\Imp \phi\).
   120 
   121 \index{strip_equals}
   122 \beginprog
   123 strip_equals: term -> (term*term) list * term
   124 \endprog
   125 Given \([t_1\equiv u_1;\ldots; t_k\equiv u_k]\Imp \phi\),
   126 returns $([(t_1,u_1),\ldots, (t_k,u_k)], \phi)$.
   127 
   128 \index{rule_of}
   129 \beginprog
   130 rule_of: (term*term)list * term list * term -> term
   131 \endprog
   132 Makes an object-rule: given the triple
   133 \[ ([(t_1,u_1),\ldots, (t_k,u_k)], [\phi_1,\ldots, \phi_m], \phi) \]
   134 returns the term
   135 \([t_1\equiv u_1;\ldots; t_k\equiv u_k; \phi_1;\ldots; \phi_m]\Imp \phi\)
   136 
   137 \index{strip_horn}
   138 \beginprog
   139 strip_horn: term -> (term*term)list * term list * term
   140 \endprog
   141 Breaks an object-rule into its parts: given
   142 \[ [t_1\equiv u_1;\ldots; t_k\equiv u_k; \phi_1;\ldots; \phi_m] \Imp \phi \]
   143 returns the triple
   144 \(([(t_k,u_k),\ldots, (t_1,u_1)], [\phi_1,\ldots, \phi_m], \phi).\)
   145 
   146 \index{strip_assums}
   147 \beginprog
   148 strip_assums: term -> (term*int) list * (string*typ) list * term
   149 \endprog
   150 Strips premises of a rule allowing a more general form,
   151 where $\Forall$ and $\Imp$ may be intermixed.
   152 This is typical of assumptions of a subgoal in natural deduction.
   153 Returns additional information about the number, names,
   154 and types of quantified variables.
   155 
   156 
   157 \index{strip_prems}
   158 \beginprog
   159 strip_prems: int * term list * term -> term list * term
   160 \endprog
   161 For finding premise (or subgoal) $i$: given the triple
   162 \( (i, [], \phi_1;\ldots \phi_i\Imp \phi) \)
   163 it returns another triple,
   164 \((\phi_i, [\phi_{i-1},\ldots, \phi_1], \phi)\),
   165 where $\phi$ need not be atomic.  Raises an exception if $i$ is out of
   166 range.
   167 
   168 
   169 \subsection{Environments}
   170 The module {\tt Envir} (which is normally closed)
   171 declares a type of environments.
   172 An environment holds variable assignments
   173 and the next index to use when generating a variable.
   174 \par\indent\vbox{\small \begin{verbatim}
   175     datatype env = Envir of {asol: term xolist, maxidx: int}
   176 \end{verbatim}}
   177 The operations of lookup, update, and generation of variables
   178 are used during unification.
   179 
   180 \beginprog
   181 empty: int->env
   182 \endprog
   183 Creates the environment with no assignments
   184 and the given index.
   185 
   186 \beginprog
   187 lookup: env * indexname -> term option
   188 \endprog
   189 Looks up a variable, specified by its indexname,
   190 and returns {\tt None} or {\tt Some} as appropriate.
   191 
   192 \beginprog
   193 update: (indexname * term) * env -> env
   194 \endprog
   195 Given a variable, term, and environment,
   196 produces {\em a new environment\/} where the variable has been updated.
   197 This has no side effect on the given environment.
   198 
   199 \beginprog
   200 genvar: env * typ -> env * term
   201 \endprog
   202 Generates a variable of the given type and returns it,
   203 paired with a new environment (with incremented {\tt maxidx} field).
   204 
   205 \beginprog
   206 alist_of: env -> (indexname * term) list
   207 \endprog
   208 Converts an environment into an association list
   209 containing the assignments.
   210 
   211 \beginprog
   212 norm_term: env -> term -> term
   213 \endprog
   214 
   215 Copies a term, 
   216 following assignments in the environment,
   217 and performing all possible \(\beta\)-reductions.
   218 
   219 \beginprog
   220 rewrite: (env * (term*term)list) -> term -> term
   221 \endprog
   222 Rewrites a term using the given term pairs as rewrite rules.  Assignments
   223 are ignored; the environment is used only with {\tt genvar}, to generate
   224 unique {\tt Var}s as placeholders for bound variables.
   225 
   226 
   227 \subsection{The unification functions}
   228 
   229 
   230 \beginprog
   231 unifiers: env * ((term*term)list) -> (env * (term*term)list) Seq.seq
   232 \endprog
   233 This is the main unification function.
   234 Given an environment and a list of disagreement pairs,
   235 it returns a sequence of outcomes.
   236 Each outcome consists of an updated environment and 
   237 a list of flex-flex pairs (these are discussed below).
   238 
   239 \beginprog
   240 smash_unifiers: env * (term*term)list -> env Seq.seq
   241 \endprog
   242 This unification function maps an environment and a list of disagreement
   243 pairs to a sequence of updated environments.  The function obliterates
   244 flex-flex pairs by choosing the obvious unifier.  It may be used to tidy up
   245 any flex-flex pairs remaining at the end of a proof.
   246 
   247 
   248 \subsubsection{Multiple unifiers}
   249 The unification procedure performs Huet's {\sc match} operation
   250 \cite{huet75} in big steps.
   251 It solves \(\Var{f}(t_1,\ldots,t_p) \equiv u\) for \(\Var{f}\) by finding
   252 all ways of copying \(u\), first trying projection on the arguments
   253 \(t_i\).  It never copies below any variable in \(u\); instead it returns a
   254 new variable, resulting in a flex-flex disagreement pair.  
   255 
   256 
   257 \beginprog
   258 type_assign: cterm -> cterm
   259 \endprog
   260 Produces a cterm by updating the signature of its argument
   261 to include all variable/type assignments.
   262 Type inference under the resulting signature will assume the
   263 same type assignments as in the argument.
   264 This is used in the goal package to give persistence to type assignments
   265 within each proof. 
   266 (Contrast with {\sc lcf}'s sticky types \cite[page 148]{paulson-book}.)
   267 
   268