[net.lang.prolog] New Prolog library file

RichardO'Keefe@sri-unix.UUCP (04/12/84)

From:  Richard O'Keefe (on ERCC DEC-10) 

Purpose: Flatten various binary trees to lists and convert back.

This file was originally for PRESS, where you often want to take
a tree such as 1+x+0+(u*v+9)+(x^2+2) and flatten it to a list
such as [1,x,u*v,9,x^2,2] so that you can easily pick out all the
constants or all the terms involving x or something, without having
to write N different sets of predicates to handle N different
binary operators.  It can be useful for other things as well.

The <operator>_to_list predicates take a binary tree (where leaf
nodes are anything not labelled by the operator) and flatten it
to a list.  They also omit "units" of that operator, that is, if
the operator is & {| + *} the constant true {false 0 1} will not
appear in the list.  The predicate

binary_to_list(Tree, Operator, Unit, Before, After)

enables you to make your own versions.  Note that the answer is
accumulated in the differnce Before-After.

binary_to_list(Tree, Operator, Before, After)

lets you convert trees where the operator has no unit.

The well known and not often useful predicate "flatten" is a not
very interesting special case of binary_to_list/5.

The list_to_<operator> predicates take a list and turn it back
into a tree.  Now there is an interesting question here: is
[a,b,c] to be turned into f(a,f(b,c)) or into f(f(a,b),c)?  The
former is a good idea for & | and '.', while the latter is a
good idea for + and *.  My solution was to have the top-level
predicate check whether the Operator is a yfx operator (such as
+ and * are) and if so to generate f(f(a,b),c).  In all other
cases (xfy,xfx, or no operator declaration) f(a,f(b,c)) is
generated.

        list_to_binary(List, Operator, Unit, Tree)

lets you make your own versions.  If the list is [] the Unit will
be returned, that is the only use of the Unit.

        list_to_binary(List, Operator, Tree)

should be used when the Operator has no Unit, if given an empty
list it will fail.

[ FLAT.PL is available from the {SU-SCORE} <Prolog> directory.
  if you cannot get it for yourself, drop me a note.  -ed]