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
* [[%SVNSTRATEGOXT%/trunk/StrategoXT/sc/spec/opt/build-match-laws.str][build-match-laws]]
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]].
-- Main.EelcoVisser - 18 Aug 2003