list_FOLD_CONVlistLib.list_FOLD_CONV : thm -> conv -> conv
Computes by inference the result of applying a function to the elements of a list.
Evaluating list_FOLD_CONV fthm conv tm returns a
theorem
|- CONST x0' ... xi' ... xn' = tm'
The first argument fthm should be a theorem of the
form
|- !x0 ... xi ... xn. CONST x0 ... xi ... xn = FOLD[LR] f e xi
where FOLD[LR] means either FOLDL or
FOLDR. The last argument tm is a term of the
following form:
CONST x0' ... xi' ... xn'
where xi' is a concrete list.
list_FOLD_CONV first instantiates the input theorem using
tm. It then calls either FOLDL_CONV or
FOLDR_CONV with the user supplied conversion
conv on the right-hand side.
list_FOLD_CONV fthm conv tm fails if fthm
or tm is not of the form described above, or if they do not
agree, or the call to FOLDL_CONV OR FOLDR_CONV
fails.
This function is used to implement conversions for logical constants
which can be expressed in terms of the fold operators. For example, the
constant SUM can be expressed in terms of
FOLDR as in the following theorem:
|- !l. SUM l = FOLDR $+ 0 l
The conversion for SUM, SUM_CONV can be
implemented as
load_library_in_place num_lib;
val SUM_CONV =
list_FOLD_CONV (theorem "list" "SUM_FOLDR") Num_lib.ADD_CONV;
Then, evaluating SUM_CONV “SUM [0;1;2;3]” will return
the following theorem:
|- SUM [0;1;2;3] = 6