----------------------------------------------------------------------------- -- | -- Module : Transform.Rules.PF -- Copyright : (c) 2010 University of Minho -- License : BSD3 -- -- Maintainer : hpacheco@di.uminho.pt -- Stability : experimental -- Portability : non-portable -- -- Pointless Rewrite: -- automatic transformation system for point-free programs -- -- Generic strategy for the rewriting of point-free functions. -- ----------------------------------------------------------------------------- module Transform.Rules.PF where import Transform.Rewriting import Transform.Rules.PF.Combinators import Transform.Rules.PF.Products import Transform.Rules.PF.Sums import Transform.Rules.PF.Dists import Transform.Rules.PF.Rec import Transform.Rules.PF.Lists import Transform.Rules.PF.Monoids import Transform.Rules.PF.Sums sum_sfusion :: Rule sum_sfusion = comp2 (prod_wunfusion >>> comp1 unabides) >>> comp sum_fusion' optimise_pf :: Rule optimise_pf = outermost rules >>> try ((once fuse1 ||| once fuse2 ||| once fuse3 ||| once fuse4 ||| once fuse5) >>> optimise_pf) where rules, fuse1, fuse2, fuse3, fuse4, fuse5 :: Rule rules = primitives ||| monoids ||| lists ||| prods ||| sums ||| bangs ||| convs ||| dists ||| recs fuse1 = top para_cata ||| top cata_fusion ||| top para_fusion ||| top ana_fusion ||| top cata_zero ||| top cata_cancel ||| top ana_cancel fuse2 = top distl_fusion ||| top distl_nat fuse3 = top hylo_id ||| top hylo_shift fuse4 = top prod_fusion ||| top sum_fusion fuse5 = top sum_sfusion beautify_pf :: Rule beautify_pf = outermost (prods ||| sums) where prods, sums :: Rule prods = top prod_unfusion ||| top prod_undef sums = top sum_unfusion ||| top sum_undef