An Odd Rewriting System/Odd.hs
Jump to navigation
Jump to search
This is an implementation, written in Haskell by Chris Pressey, of An Odd Rewriting System. It is only a partial implementation, because it doesn't implement parsing or the halting symbol.
import Data.Char
data Defn = Defn {
symbol :: Char,
oddDefn :: String,
evenDefn :: String
} deriving (Show)
data Program = Program {
defns :: [Defn],
initial :: String
} deriving (Show)
isOdd = isUpper
isEven = isLower
findDefn char defnGetter [] = error "No such defn"
findDefn char defnGetter (defn:defns) =
if symbol defn == char then defnGetter defn else findDefn char defnGetter defns
run program = evolve (initial program) (defns program)
evolve dataString defns =
let
dataString' = step dataString defns
in
[dataString] ++ evolve dataString' defns
step dataString defns =
let
(transformedSymbols, _) = foldl (transformSymbol) ([],0) dataString
in
concat transformedSymbols
where
transformSymbol (newElems, numSeenOddSymbols) char =
let
defnGetter = if numSeenOddSymbols `mod` 2 == 0 then evenDefn else oddDefn
replacement = findDefn char defnGetter defns
numSeenOddSymbols' = numSeenOddSymbols + if isOdd char then 1 else 0
in
(newElems ++ [replacement], numSeenOddSymbols')
To show that this implements the semantics of An Odd Rewriting System you can write something like
testProg1 = Program{
initial = "Cwg",
defns = [
Defn{ symbol='c', evenDefn="c", oddDefn="C" },
Defn{ symbol='C', evenDefn="C", oddDefn="c" },
Defn{ symbol='g', evenDefn="wg",oddDefn="wg" },
Defn{ symbol='w', evenDefn="w", oddDefn="C" }
]
}
test1 = take 20 (run testProg1)