File: DEPTH_CONV.doc

package info (click to toggle)
hol-light 20170109-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 36,568 kB
  • ctags: 8,549
  • sloc: ml: 540,018; cpp: 439; lisp: 286; java: 279; makefile: 262; sh: 229; yacc: 108; perl: 78; ansic: 57; sed: 39
file content (67 lines) | stat: -rw-r--r-- 2,474 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
\DOC DEPTH_CONV

\TYPE {DEPTH_CONV : conv -> conv}

\SYNOPSIS
Applies a conversion repeatedly to all the sub-terms of a term, in bottom-up
order.

\KEYWORDS
conversional.

\DESCRIBE
{DEPTH_CONV c tm} repeatedly applies the conversion {c} to all the subterms of
the term {tm}, including the term {tm} itself.  The supplied conversion is
applied repeatedly (zero or more times, as is done by {REPEATC}) to each
subterm until it fails. The conversion is applied to subterms in bottom-up
order.

\FAILURE
{DEPTH_CONV c tm} never fails but can diverge if the conversion {c} can be
applied repeatedly to some subterm of {tm} without failing.

\EXAMPLE
The following example shows how {DEPTH_CONV} applies a conversion to all
subterms to which it applies:
{
  # DEPTH_CONV BETA_CONV `(\x. (\y. y + x) 1) 2`;;
  val it : thm = |- (\x. (\y. y + x) 1) 2 = 1 + 2
}
\noindent Here, there are two beta-redexes in the input term, one of which
occurs within the other. {DEPTH_CONV BETA_CONV} applies beta-conversion to
innermost beta-redex {(\y. y + x) 1} first.  The outermost beta-redex is then
{(\x. 1 + x) 2}, and beta-conversion of this redex gives {1 + 2}.

Because {DEPTH_CONV} applies a conversion bottom-up, the final result may still
contain subterms to which the supplied conversion applies.  For example, in:
{
  # DEPTH_CONV BETA_CONV `(\f x. (f x) + 1) (\y.y) 2`;;
  val it : thm = |- (\f x. f x + 1) (\y. y) 2 = (\y. y) 2 + 1
}
\noindent the right-hand side of the result still contains a beta-redex,
because the redex {`(\y.y)2`} is introduced by virtue an application of
{BETA_CONV} higher-up in the structure of the input term.  By contrast, in the
example:
{
  # DEPTH_CONV BETA_CONV `(\f x. (f x)) (\y.y) 2`;;
  val it : thm = |- (\f x. f x) (\y. y) 2 = 2
}
\noindent all beta-redexes are eliminated, because {DEPTH_CONV} repeats the
supplied conversion (in this case, {BETA_CONV}) at each subterm (in this case,
at the top-level term).

\USES
If the conversion {c} implements the evaluation of a function in logic, then
{DEPTH_CONV c} will do bottom-up evaluation of nested applications of it.
For example, the conversion {ADD_CONV} implements addition of natural number
constants within the logic. Thus, the effect of:
{
  # DEPTH_CONV NUM_ADD_CONV `(1 + 2) + (3 + 4 + 5)`;;
  val it : thm = |- (1 + 2) + 3 + 4 + 5 = 15
}
\noindent is to compute the sum represented by the input term.

\SEEALSO
ONCE_DEPTH_CONV, REDEPTH_CONV, TOP_DEPTH_CONV, TOP_SWEEP_CONV.

\ENDDOC