packages feed

pointless-rewrite-0.0.1: src/Transform/Rules/PF.hs

-----------------------------------------------------------------------------
-- |
-- 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