[net.lang.prolog] Reply to Yoav Shoham

Narain%Rand-Unix@sri-unix.UUCP (03/31/84)

The following pure Prolog program will do breadth-first
traversal of a tree in o(v) time. The input to 'bf' is
a list of nodes at some level. (At the top level it is
simply [root]). The output is a list of nodes of the
tree traversed in breadth-first order.

The algorithm may also be used to traverse a graph without
cycles, but as there is no equivalent of a 'mark' bit here,
nodes may be repeated in the output.

bf([],[]).
bf(L,Z):-successor_list(L,SL),bf(SL,BSL),append(L,BSL,Z).

successor_list([],[]).
successor_list([U|V],Z):-succ(U,SU),successor_list(V,SV), append(SU,SV,Z).

append([],X,X).
append([U|V],W,[U|Z]):-append(V,W,Z).

Procedure 'succ' contains clauses of the form

     succ(Node,Successor_list)

where 'Successor_list' is a list of immediate sucessors of
'Node'. If 'Node' is a terminal node then 'Successor_list'
is [].

-- Sanjai Narain