MAP_CONV.doc

advertisement
\DOC MAP_CONV
\TYPE {MAP_CONV : conv -> conv}
\SYNOPSIS
Compute the result of mapping a function down a list.
\KEYWORDS
conversion, list.
\DESCRIBE
The function {MAP_CONV} is a parameterized conversion for computing the
result
of mapping a function {f:ty1->ty2} down a list {--`[t1;...;tn]`--} of
elements of
type {ty1}. The first argument to {MAP_CONV} is expected to be a
conversion
that computes the result of applying the function {f} to an element of
this
list. When applied to a term {--`f ti`--}, this conversion should return
a theorem
of the form {|- (f ti) = ri}, where {ri} is the result of applying the
function
{f} to the element {ti}.
Given an appropriate {conv}, the conversion {MAP_CONV conv} takes a
term of the form {--`MAP f [t1;...;tn]`--} to the theorem
{
|- MAP f [t1;...;tn] = [r1;...;rn]
}
where {conv (--`f ti`--)} returns {|- (f ti) = ri} for {i} from {1} to
{n}.
\EXAMPLE
The following is a very simple example in which no computation is done
for
applications of the function being mapped down a list:
{
- MAP_CONV ALL_CONV (--`MAP SUC [1;2;1;4]`--);
|- MAP SUC[1;2;1;4] = [SUC 1;SUC 2;SUC 1;SUC 4]
}
The result just contains applications of {SUC}, since the supplied
conversion {ALL_CONV} does no evaulation.
We now construct a conversion that maps {SUC n} for any numeral {n} to
the
numeral standing for the successor of {n}:
{
- fun SUC_CONV tm =
let val n = string_to_int(#Name(dest_const(rand tm)))
val sucn = mk_const{{Name =int_to_string(n+1),
Ty=(==`:num`==)}}
in
SYM (num_CONV sucn)
end;
SUC_CONV = - : conv
}
The result is a conversion that inverts {num_CONV}:
{
- num_CONV (--`4`--);
|- 4 = SUC 3
- SUC_CONV (--`SUC 3`--);
|- SUC 3 = 4
}
The conversion {SUC_CONV} can then be used to compute the
result of mapping the successor function down a list of numerals:
{
- MAP_CONV SUC_CONV (--`MAP SUC [1;2;1;4]`--);
|- MAP SUC[1;2;1;4] = [2;3;2;5]
}
\FAILURE
{MAP_CONV conv} fails if applied to a term
{--`MAP f [t1;...;tn]`--}. An application
{--`MAP f [t1;...;tn]`--} fails unless for
{[t1;...;tn]},
evaluating {conv (--`f ti`--)} returns {|\ENDDOC
not of the form
of {MAP_CONV conv} to a term
all {ti} in the list
(f ti) = ri} for some {ri}.
Download