  A program execution monitor is a program that collects and abstracts
information about program executions. The "collect" operator is a high level,
general purpose primitive which lets users implement their own monitors.
"Collect" is built on top of the Mercury trace. In previous work, we have
demonstrated how this operator can be used to efficiently collect various kinds
of statistics about Mercury program executions. In this article we further
demonstrate the expressive power and effectiveness of "collect" by providing
more monitor examples. In particular, we show how to implement monitors that
generate graphical abstractions of program executions such as proof trees,
control flow graphs and dynamic call graphs. We show how those abstractions can
be easily modified and adapted, since those monitors only require several
dozens of lines of code. Those abstractions are intended to serve as front-ends
of software visualization tools. Although "collect" is currently implemented on
top of the Mercury trace, none of its underlying concepts depend of Mercury and
it can be implemented on top of any tracer for any programming language.
