Build Match Fusion

Stratego -- Strategies for Program Transformation
The composition of a match and a build (in either order) can often be simplified. If the match following a build is incompatible, failure is certain. For example,
  !Foo(Bar(x), y); ?FooBar(z)
can be replaced with fail since the match will never succeed.

If the build and match are compatible (i.e., if they can be unified), the sequence can be simplified. For example,

  !Foo(Bar(x), y); ?Foo(z1, z2); ...
can be replaced with
  !Bar(x); ?z1; !y; ?z2; !Foo(Bar(x), y); ...
Subsequent transformations can get rid of the construction of the entire term, if it is not needed.

These ideas are implemented by simple rewrite rules in module

The rules are applied by the Stratego simplifier. Often these rules are triggered by inlining (which brings matches and builds together). The results are simplified by constant and copy propagation and dead variable elimination.

-- EelcoVisser - 18 Aug 2003