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