packages feed

adp-multi-0.2.0: tests/ADP/Tests/NestedExample.hs

module ADP.Tests.NestedExample where

import ADP.Multi.All
import ADP.Multi.Rewriting.All
                                 
type Nested_Algebra alphabet answer = (
  EPS -> answer,                              -- nil
  answer   -> answer -> answer,               -- left
  answer   -> answer -> answer,               -- pair
  alphabet -> answer -> alphabet -> answer,   -- basepair
  alphabet -> answer,                         -- base
  [answer] -> [answer]                        -- h
  )

-- test using record syntax
data NestedAlgebra alphabet answer = NestedAlgebra {
  nil :: EPS -> answer,          
  left :: answer -> answer -> answer,
  pair :: answer -> answer -> answer,
  basepair :: alphabet -> answer -> alphabet -> answer,
  base :: alphabet -> answer,
  h :: [answer] -> [answer]
  }
  
infixl ***
(***) :: (Eq b, Eq c) => Nested_Algebra a b -> Nested_Algebra a c -> Nested_Algebra a (b,c)
alg1 *** alg2 = (nil,left,pair,basepair,base,h) where
   (nil',left',pair',basepair',base',h') = alg1
   (nil'',left'',pair'',basepair'',base'',h'') = alg2
   
   nil a = (nil' a, nil'' a)
   left (b1,b2) (s1,s2) = (left' b1 s1, left'' b2 s2)
   pair (p1,p2) (s1,s2) = (pair' p1 s1, pair'' p2 s2)
   basepair a (s1,s2) b = (basepair' a s1 b,  basepair'' a s2 b)
   base a = (base' a, base'' a)
   h xs = [ (x1,x2) |
            x1 <- h'  [ y1 | (y1,_)  <- xs]
          , x2 <- h'' [ y2 | (y1,y2) <- xs, y1 == x1]
          ]


data Start = Nil
           | Left' Start Start
           | Pair Start Start
           | BasePair Char Start Char
           | Base Char
           deriving (Eq, Show)

-- without consistency checks
enum :: Nested_Algebra Char Start
enum = (nil,left,pair,basepair,base,h) where
   nil _     = Nil
   left      = Left'
   pair      = Pair 
   basepair  = BasePair
   base      = Base
   h         = id 
   
enum' :: NestedAlgebra Char Start
enum' = NestedAlgebra {
   nil       = \ _ -> Nil, -- hmm, this sucks
   left      = Left',
   pair      = Pair,
   basepair  = BasePair,
   base      = Base,
   h         = id
   }
   
maxBasepairs :: Nested_Algebra Char Int
maxBasepairs = (nil,left,pair,basepair,base,h) where
   nil _            = 0
   left _ b         = b
   pair a b         = a + b
   basepair _ s _   = 1 + s
   base _           = 0
   h []             = []
   h xs             = [maximum xs]

-- The left part is the structure and the right part the reconstructed input.
prettyprint :: Nested_Algebra Char (String,String)
prettyprint = (nil,left,pair,basepair,base,h) where
   nil _ = ("","")
   left (b1,b2) (sl,sr) = (b1 ++ sl, b2 ++ sr)
   pair (pl,pr) (sl,sr) = (pl ++ sl, pr ++ sr)
   basepair b1 (sl,sr) b2 = ("(" ++ sl ++ ")", [b1] ++ sr ++ [b2])
   base b = (".", [b])
   h = id
   
pstree :: Nested_Algebra Char String
pstree = (nil,left,pair,basepair,base,h) where
   nil _ = "\\emptyword"
   left b s = nonterm "B" b ++ nonterm "S" s
   pair p s = nonterm "P" p ++ nonterm "S" s
   basepair b1 s b2 = base b1 ++ nonterm "S" s ++ base b2
   base b = "\\terminal{" ++ [b] ++ "}"
   h = id
   
   nonterm sym tree = "\\pstree{\\nonterminal{" ++ sym ++ "}}{" ++ tree ++ "}"
   
term :: Nested_Algebra Char String
term = (nil,left,pair,basepair,base,h) where
   nil _ = "\\op{f}_3()"
   left b s = "\\op{f}_2(" ++ b ++ "," ++ s ++ ")"
   pair p s = "\\op{f}_2(" ++ p ++ "," ++ s ++ ")"
   basepair b1 s b2 = "\\op{f}_4(" ++ [b1] ++ "," ++ s ++ "," ++ [b2] ++ ")"
   base b = "\\op{f}_5(" ++ [b] ++ ")"
   h = id
   
termPlain :: Nested_Algebra Char String
termPlain = (nil,left,pair,basepair,base,h) where
   nil _ = "f_3"
   left b s = "f_2(" ++ b ++ "," ++ s ++ ")"
   pair p s = "f_2(" ++ p ++ "," ++ s ++ ")"
   basepair b1 s b2 = "f_4(" ++ [b1] ++ "," ++ s ++ "," ++ [b2] ++ ")"
   base b = "f_5(" ++ [b] ++ ")"
   h = id
   
nested :: Nested_Algebra Char answer -> String -> [answer]
nested algebra inp =
  let  
  (nil,left,pair,basepair,base,h) = algebra
     
  s = tabulated $
      yieldSize1 (0,Nothing) $
      nil  <<< EPS     >>> id1 |||
      left <<< b ~~~ s >>> id1 |||
      pair <<< p ~~~ s >>> id1
      ... h
  
  b = tabulated $
      base <<< 'a' >>> id1 |||
      base <<< 'u' >>> id1 |||
      base <<< 'c' >>> id1 |||
      base <<< 'g' >>> id1
  
  p = tabulated $
      basepair <<< 'a' ~~~ s ~~~ 'u' >>> id1 |||
      basepair <<< 'u' ~~~ s ~~~ 'a' >>> id1 |||
      basepair <<< 'c' ~~~ s ~~~ 'g' >>> id1 |||
      basepair <<< 'g' ~~~ s ~~~ 'c' >>> id1 |||
      basepair <<< 'g' ~~~ s ~~~ 'u' >>> id1 |||
      basepair <<< 'u' ~~~ s ~~~ 'g' >>> id1
      
  z = mk inp
  tabulated = table1 z
  
  in axiom z s