-----------------------------------------------------------------------------
-- |
-- 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 = 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 = outermost (prods ||| sums)
where
prods = top prod_unfusion ||| top prod_undef
sums = top sum_unfusion ||| top sum_undef