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 |
|