adp-multi-0.2.3: tests/ADP/Tests/CopyTwoTrackExample.hs
-- | Copy language L = { (w,w) | w in {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