----------------------------------------------------------------------------- -- | -- 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 optimise_pf :: Rule optimise_pf = outermost (top comp_assocr ||| rules) >>> right >>> try (once fuse >>> optimise_pf) where right, rules, prot, undef, lns, prods, sums, bangs, dists, convs, recs, fuse :: Rule right = many (once (top comp_assocr)) rules = top nat_id ||| prot ||| undef ||| lns ||| prods ||| sums ||| bangs ||| dists ||| convs ||| recs prot = top unprotect undef = top top_fusion lns = top create_get ||| top put_get ||| top get_put ||| top create_put ||| top put_twice prods = top prod_functor_id ||| top prod_functor_comp ||| top prod_cancel ||| top prod_absor ||| top prod_eta ||| top swap_def ||| top assocl_def ||| top assocr_def sums = top sum_functor_id ||| top sum_functor_comp ||| top sum_eta ||| top sum_cancel ||| top sum_absor ||| top abides ||| top coswap_def ||| top coassocl_def ||| top coassocr_def bangs = top bang_reflex ||| top bang_fusion ||| top bang_uniq dists = top distr_def ||| top undistr_def ||| top distl_iso ||| top undistl_iso ||| top undistl_def ||| top distl_fst_cancel ||| top distl_snd_cancel ||| top distl_id_cancel ||| top distl_sum_cancel ||| top distl_bang_cancel ||| top distl_cancel ||| top distl_distl_fusion convs = top rconv_cancel ||| top lconv_cancel ||| top conv_conv ||| top conv_id ||| top conv_comp ||| top conv_inn ||| top conv_out ||| top conv_prod ||| top conv_sum recs = top in_iso ||| top out_iso ||| top functor_id ||| top functor_comp ||| top functor_def ||| top fzip_def ||| top cata_reflex ||| top cata_cancel ||| top para_reflex ||| top para_cancel ||| top para_cata ||| top ana_reflex ||| top ana_cancel fuse = top prod_fusion ||| top sum_fusion {- ||| top prod_def ||| top sum_def-} ||| top distl_fusion ||| top distl_nat {-||| top hylo_id ||| top cata_fusion ||| top ana_fusion ||| top hylo_shift-} 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