packages feed

adp-multi-0.2.2: tests/ADP/Tests/CopyTwoTrackExample.hs

-- Copy language L = { (w,w) | w € {a,b}^* }
module ADP.Tests.CopyTwoTrackExample where

import ADP.Debug
import ADP.Multi.All
import ADP.Multi.Rewriting.All
                                 
type CopyTT_Algebra alphabet answer = (
  (EPS,EPS) -> answer,                      -- nil
  alphabet -> alphabet -> answer -> answer  -- copy
  )

data Start = Nil
           | Copy Char Char Start
           deriving (Eq, Show)

enum :: CopyTT_Algebra Char Start
enum = (\_-> Nil,Copy)
   
prettyprint :: CopyTT_Algebra Char (String,String)
prettyprint = (nil,copy) where
   nil _ = ("","")
   copy c1 c2 (l,r) = ([c1] ++ l,[c2] ++ r) 

-- (count of a's, count of b's)
countABs :: CopyTT_Algebra Char (Int,Int)
countABs = (nil,copy) where
   nil _                = (0,0)
   copy 'a' 'a' (c1,c2) = (c1+1,c2)
   copy 'b' 'b' (c1,c2) = (c1,c2+1)
  
   
copyTTGr ::CopyTT_Algebra Char answer -> (String,String) -> [answer]
copyTTGr _ inp | trace ("running copyTTGr on " ++ show inp) False = undefined
copyTTGr algebra (inp1,inp2) =
  let  
  (nil,copy) = algebra
  
  rewriteCopy :: Dim2
  rewriteCopy [a',a'',c1,c2] = ([a',c1],[a'',c2])
  
  c = tabulated2 $
      yieldSize2 (0,Nothing) (0,Nothing) $
      copy <<< 'a' ~~~ 'a' ~~~ c >>> rewriteCopy |||
      copy <<< 'b' ~~~ 'b' ~~~ c >>> rewriteCopy |||
      nil  <<< (EPS,EPS)         >>> id2
      
  z = mkTwoTrack inp1 inp2
  tabulated2 = table2 z
  
  in axiomTwoTrack z inp1 inp2 c