module LSystem (
LSystem (..),
LPrim (..),
derivations,
interprete,
interpretations
) where
import Turtle
-- LSystem module = LSystem axiom ableitungsregeln
data LSystem m = LSystem [LPrim m] (m -> [LPrim m])
data LPrim m = LPrim m | LStack [LPrim m]
-------------------------------------------------------------------------------
-- Einzelnes, primitives Modul ableiten
derive :: (m -> [LPrim m]) -> LPrim m -> [LPrim m]
derive rules x = case x of
LPrim p -> rules p
LStack s -> [LStack $ concatMap (derive rules) s]
-- Erzeugt Liste aller Ableitungen eines L-Systems
derivations :: LSystem m -> [ [LPrim m] ]
derivations (LSystem startword rules) = derivations'
where
derivations' = startword : map (concatMap $ derive rules) derivations'
-- Übersetzt ein Wort von Modulen des Typs m in ein Wort von Modulen des Typs
-- TurtleModule
interprete :: (m -> [LPrim TurtleModule]) -> [m] -> [LPrim TurtleModule]
interprete = concatMap
-- Wendet interprete auf eine Liste von Modulworten an
interpretations :: (m -> [LPrim TurtleModule]) -> [[LPrim m]] -> [[LPrim TurtleModule]]
interpretations rules = map (interprete intPrim)
where
intPrim x = case x of
LPrim p -> rules p
LStack s -> [LStack $ (interprete intPrim) s]