Examples of Pointwise - Pointfree transformations

Abs.hs - original

module Main (main) where

module Abs where

{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation: `\x -> x`
fun = \x y z -> x
>

Abs.hs - resulting

module Abs where

{- imports will be added for the PointlessP librasies -}

import PointlessP.Combinators
import PointlessP.Functors
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



-- the whole expression will be selected for translation: `\x -> x`
fun = app .
          (((curry (curry (curry ((snd . fst) . fst)))) .
                bang) /\
               id)

Ite.hs - original

 
module Ite where

{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation.
notZero = \x -> if (== 0) x then False else True

Ite.hs - resulting

module Ite where

{- imports will be added for the PointlessP librasies -}

import PointlessP.Combinators
import PointlessP.Functors
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



-- the whole expression will be selected for translation.
notZero = app .
              (((curry
                     (app .
                          ((curry
                                ((((inN (_L :: Bool)) . (Right . bang)) \/
                                      ((inN (_L :: Bool)) . (Left . bang))) .
                                     distr)) /\
                               ((ouT (_L :: Bool)) .
                                    (app .
                                         ((curry
                                               ((((inN (_L :: Bool)) . (Left . bang)) \/
                                                     ((inN (_L :: Bool)) .
                                                          (Right . bang))) .
                                                    distr)) /\
                                              ((ouT (_L :: Int)) . snd))))))) .
                    bang) /\
                   id)

Case.hs - original

module Case where

{- imports will be added for the PointlessP librasies -}

-- the hole expression will be selected for translation.
coswap = \x -> case x of Left y -> Right y
                         Right y -> Left y

Case.hs - resulting

module Case where

{- imports will be added for the PointlessP librasies -}

import PointlessP.Combinators
import PointlessP.Functors
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



-- the hole expression will be selected for translation.
coswap = app .
             (((curry
                    (app .
                         ((curry (((Right . snd) \/ (Left . snd)) . distr)) /\
                              snd))) .
                   bang) /\
                  id)

RecNat.hs - original

module RecNat where

{- imports will be added for the PointlessP librasies -}

recNat :: Int -> (Int -> a -> a) -> a -> a
recNat 0 f z = z
recNat n f z = f (n-1) (recNat (n-1) f z)
--Programatica parser can't read:
--   recNat (n+1) f z = f n (recNat n f z)


-- the whole expression will be selected for translation.
-- note that recNat can be converted into a paramorphism because
--  the 2nd and 3rd arguments don't have free variables
double = \n -> recNat n (\pred rec -> succ (succ rec)) 0

RecNat.hs - resulting

module RecNat where

import PointlessP.Combinators
import PointlessP.Functors
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



{- imports will be added for the PointlessP librasies -}

recNat :: Int -> (Int -> a -> a) -> a -> a
recNat 0 f z = z
recNat n f z = f (n-1) (recNat (n-1) f z)
--Programatica parser can't read:
--   recNat (n+1) f z = f n (recNat n f z)


-- the whole expression will be selected for translation.
-- note that recNat can be converted into a paramorphism because
--  the 2nd and 3rd arguments don't have free variables
double = app .
             (((curry
                    ((para (_L :: Int)
                          (app .
                               (((curry
                                      (app .
                                           ((curry
                                                 ((((inN (_L :: Int)) . (Left . bang)) \/
                                                       (app .
                                                            ((app .
                                                                  ((curry
                                                                        (curry
                                                                             ((inN (_L :: Int)) .
                                                                                  (Right .
                                                                                       ((inN (_L :: Int)) .
                                                                                            (Right .
                                                                                                 snd)))))) /\
                                                                       (snd . snd))) /\
                                                                 (fst . snd)))) .
                                                      distr)) /\
                                                snd))) .
                                     bang) /\
                                    id))) .
                         snd)) .
                   bang) /\
                  id)

InfixOp.hs - original

module InfixOp where

import PointlessP.Combinators

{- imports will be added for the PointlessP librasies -}


(.+.) _ n m  = n + m

subt _ n m = n - m


-- the whole expression will be selected for translation.
--    it calculates f x y = 2x-2y.
--    Note that all the free variables (of the selected expression) will
--     have a different type after the transformation.
calculate = \x y -> subt ((x .+. x) `subt` y) y

InfixOp.hs - resulting

module InfixOp where

import PointlessP.Combinators
import PointlessP.Functors
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



{- imports will be added for the PointlessP librasies -}


(.+.) _ n m  = n + m

subt _ n m = n - m


-- the whole expression will be selected for translation.
--    it calculates f x y = 2x-2y.
--    Note that all the free variables (of the selected expression) will
--     have a different type after the transformation.
calculate = app .
                (((curry
                       (curry
                            (app .
                                 ((app .
                                       (((subt . fst) . fst) /\
                                            (app .
                                                 ((app .
                                                       (((subt . fst) . fst) /\
                                                            (app .
                                                                 ((app .
                                                                       ((((.+.) . fst) .
                                                                             fst) /\
                                                                            (snd . fst))) /\
                                                                      (snd . fst))))) /\
                                                      snd)))) /\
                                      snd)))) .
                      bang) /\
                     id)

InOut.hs - original

module InOut where

import PointlessP.Functors
import PointlessP.Combinators

{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation.
tail' = \lst -> case (ouT (_L::[a]) lst) of
                    Left x -> inN (_L::[a]) (Left _L) 
                        -- if the list is emptu, return the empty list
                    Right x -> x
                        -- otherwise return the tail 

InOut.hs - resulting

module InOut where

import PointlessP.Functors
import PointlessP.Combinators
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns


{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation.
tail' = app .
            (((curry
                   (app .
                        ((curry
                              ((((inN (_L :: [a])) . (Left . bang)) \/ snd) .
                                   distr)) /\
                             ((ouT (_L :: [a])) . snd)))) .
                  bang) /\
                 id)
                        -- otherwise return the tail 

Let.hs - original

module Let where

import PointlessP.Functors

{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation.
isort =
   let leq = \x y -> if (==0) x then True
                          else if y==0 then False
                               else leq (pred x) (pred y)

   in let insert = \x lst ->
                     if null lst then [x]
                     else if (leq x (head lst))
                          then x : lst
                          else (head lst) : (insert x (tail lst))

      in let isort = \lst -> if (null lst)
                             then []
                             else insert (head lst) (isort (tail lst))

         in isort


Let.hs - resulting

module Let where

import PointlessP.Functors
import PointlessP.Combinators
import PointlessP.Isomorphisms
import PointlessP.RecursionPatterns



{- imports will be added for the PointlessP librasies -}

-- the whole expression will be selected for translation.
isort =
   app .
       (((app .
              ((curry
                    (app .
                         ((curry
                               (app .
                                    ((curry snd) /\
                                         (fix .
                                              (curry
                                                   (curry
                                                        (app .
                                                             ((curry
                                                                   ((((inN (_L :: [a])) .
                                                                          (Left .
                                                                               bang)) \/
                                                                         (app .
                                                                              ((app .
                                                                                    ((((snd .
                                                                                            fst) .
                                                                                           fst) .
                                                                                          fst) /\
                                                                                         (app .
                                                                                              ((curry
                                                                                                    ((((((((undefined .
                                                                                                                fst) .
                                                                                                               fst) .
                                                                                                              fst) .
                                                                                                             fst) .
                                                                                                            fst) .
                                                                                                           fst) \/
                                                                                                          (fst .
                                                                                                               snd)) .
                                                                                                         distr)) /\
                                                                                                   ((ouT (_L :: [a])) .
                                                                                                        (snd .
                                                                                                             fst)))))) /\
                                                                                   (app .
                                                                                        (((snd .
                                                                                               fst) .
                                                                                              fst) /\
                                                                                             (app .
                                                                                                  ((curry
                                                                                                        ((((inN (_L :: [a])) .
                                                                                                               (Left .
                                                                                                                    bang)) \/
                                                                                                              (snd .
                                                                                                                   snd)) .
                                                                                                             distr)) /\
                                                                                                       ((ouT (_L :: [a])) .
                                                                                                            (snd .
                                                                                                                 fst))))))))) .
                                                                        distr)) /\
                                                                  ((ouT (_L :: Bool)) .
                                                                       (app .
                                                                            ((curry
                                                                                  ((((inN (_L :: Bool)) .
                                                                                         (Left .
                                                                                              bang)) \/
                                                                                        ((inN (_L :: Bool)) .
                                                                                             (Right .
                                                                                                  bang))) .
                                                                                       distr)) /\
                                                                                 ((ouT (_L :: [a])) .
                                                                                      snd)))))))))))) /\
                              (fix .
                                   (curry
                                        (curry
                                             (curry
                                                  (app .
                                                       ((curry
                                                             ((((inN (_L :: [a])) .
                                                                    (Right .
                                                                         (((snd .
                                                                                fst) .
                                                                               fst) /\
                                                                              ((inN (_L :: [a])) .
                                                                                   (Left .
                                                                                        bang))))) \/
                                                                   (app .
                                                                        ((curry
                                                                              ((((inN (_L :: [a])) .
                                                                                     (Right .
                                                                                          ((((snd .
                                                                                                  fst) .
                                                                                                 fst) .
                                                                                                fst) /\
                                                                                               ((snd .
                                                                                                     fst) .
                                                                                                    fst)))) \/
                                                                                    ((inN (_L :: [a])) .
                                                                                         (Right .
                                                                                              ((app .
                                                                                                    ((curry
                                                                                                          (((((((((undefined .
                                                                                                                       fst) .
                                                                                                                      fst) .
                                                                                                                     fst) .
                                                                                                                    fst) .
                                                                                                                   fst) .
                                                                                                                  fst) .
                                                                                                                 fst) \/
                                                                                                                (fst .
                                                                                                                     snd)) .
                                                                                                               distr)) /\
                                                                                                         ((ouT (_L :: [a])) .
                                                                                                              ((snd .
                                                                                                                    fst) .
                                                                                                                   fst)))) /\
                                                                                                   (app .
                                                                                                        ((app .
                                                                                                              (((((snd .
                                                                                                                       fst) .
                                                                                                                      fst) .
                                                                                                                     fst) .
                                                                                                                    fst) /\
                                                                                                                   (((snd .
                                                                                                                          fst) .
                                                                                                                         fst) .
                                                                                                                        fst))) /\
                                                                                                             (app .
                                                                                                                  ((curry
                                                                                                                        ((((inN (_L :: [a])) .
                                                                                                                               (Left .
                                                                                                                                    bang)) \/
                                                                                                                              (snd .
                                                                                                                                   snd)) .
                                                                                                                             distr)) /\
                                                                                                                       ((ouT (_L :: [a])) .
                                                                                                                            ((snd .
                                                                                                                                  fst) .
                                                                                                                                 fst)))))))))) .
                                                                                   distr)) /\
                                                                             ((ouT (_L :: Bool)) .
                                                                                  (app .
                                                                                       ((app .
                                                                                             (((((snd .
                                                                                                      fst) .
                                                                                                     fst) .
                                                                                                    fst) .
                                                                                                   fst) /\
                                                                                                  ((snd .
                                                                                                        fst) .
                                                                                                       fst))) /\
                                                                                            (app .
                                                                                                 ((curry
                                                                                                       ((((((((undefined .
                                                                                                                   fst) .
                                                                                                                  fst) .
                                                                                                                 fst) .
                                                                                                                fst) .
                                                                                                               fst) .
                                                                                                              fst) \/
                                                                                                             (fst .
                                                                                                                  snd)) .
                                                                                                            distr)) /\
                                                                                                      ((ouT (_L :: [a])) .
                                                                                                           (snd .
                                                                                                                fst)))))))))) .
                                                                  distr)) /\
                                                            ((ouT (_L :: Bool)) .
                                                                 (app .
                                                                      ((curry
                                                                            ((((inN (_L :: Bool)) .
                                                                                   (Left .
                                                                                        bang)) \/
                                                                                  ((inN (_L :: Bool)) .
                                                                                       (Right .
                                                                                            bang))) .
                                                                                 distr)) /\
                                                                           ((ouT (_L :: [a])) .
                                                                                snd))))))))))))) /\
                   (fix .
                        (curry
                             (curry
                                  (curry
                                       (app .
                                            ((curry
                                                  ((((inN (_L :: Bool)) .
                                                         (Left . bang)) \/
                                                        (app .
                                                             ((curry
                                                                   ((((inN (_L :: Bool)) .
                                                                          (Right .
                                                                               bang)) \/
                                                                         (app .
                                                                              ((app .
                                                                                    (((((snd .
                                                                                             fst) .
                                                                                            fst) .
                                                                                           fst) .
                                                                                          fst) /\
                                                                                         (app .
                                                                                              ((curry
                                                                                                    ((((inN (_L :: Int)) .
                                                                                                           (Left .
                                                                                                                bang)) \/
                                                                                                          snd) .
                                                                                                         distr)) /\
                                                                                                   ((ouT (_L :: Int)) .
                                                                                                        (((snd .
                                                                                                               fst) .
                                                                                                              fst) .
                                                                                                             fst)))))) /\
                                                                                   (app .
                                                                                        ((curry
                                                                                              ((((inN (_L :: Int)) .
                                                                                                     (Left .
                                                                                                          bang)) \/
                                                                                                    snd) .
                                                                                                   distr)) /\
                                                                                             ((ouT (_L :: Int)) .
                                                                                                  ((snd .
                                                                                                        fst) .
                                                                                                       fst))))))) .
                                                                        distr)) /\
                                                                  ((ouT (_L :: Bool)) .
                                                                       (app .
                                                                            ((curry
                                                                                  ((((inN (_L :: Bool)) .
                                                                                         (Left .
                                                                                              bang)) \/
                                                                                        ((inN (_L :: Bool)) .
                                                                                             (Right .
                                                                                                  bang))) .
                                                                                       distr)) /\
                                                                                 ((ouT (_L :: Int)) .
                                                                                      (snd .
                                                                                           fst)))))))) .
                                                       distr)) /\
                                                 ((ouT (_L :: Bool)) .
                                                      (app .
                                                           ((curry
                                                                 ((((inN (_L :: Bool)) .
                                                                        (Left .
                                                                             bang)) \/
                                                                       ((inN (_L :: Bool)) .
                                                                            (Right .
                                                                                 bang))) .
                                                                      distr)) /\
                                                                ((ouT (_L :: Int)) .
                                                                     (snd .
                                                                          fst))))))))))))) .
             bang) /\
            id)