2 Maitainer : jmvilaca@di.uminho.pt
16 , getMapping, setMapping
23 , copyLHSInterface2RHS
30 import Network hiding (getName, setName)
34 import qualified Data.IntMap as IntMap (empty)
40 data INRule g n e = INRule
41 { ruleName :: String -- ^ the name of the rule
42 , ruleLHS :: Network g n e -- ^ the rule LHS network
43 , ruleRHS :: Network g n e -- ^ the rule RHS network
44 , ruleMaps :: Mapping -- ^ mappings between the LHS and RHS
47 -- | @(n_i, n_j)@ means that node n_i in the LHS of the rule corresponds to node n_j in the RHS
48 -- @n_i@ and @n_j@ have to be interface nodes
49 type MappingElement = (NodeNr, NodeNr)
50 type Mapping = [MappingElement]
52 showsMapping :: Mapping -> ShowS
53 showsMapping [] = showString "{}"
55 showChar '{' . showsE x . showl xs
56 where showl [] = showChar '}'
57 showl (x:xs) = showChar ',' . showsE x . showl xs
58 showsE (from,to) = shows from . showString " |-> " . shows to
60 initial :: (InfoKind e g, InfoKind n g) => g -> n -> e -> INRule g n e
62 INRule { ruleName = "Rule 1"
63 , ruleLHS = Network.empty g n e
64 , ruleRHS = Network.empty g n e
69 getName :: INRule g n e -> String
72 getLHS :: INRule g n e -> Network g n e
75 getRHS :: INRule g n e -> Network g n e
78 getMapping :: INRule g n e -> Mapping
81 setName :: String -> INRule g n e -> INRule g n e
82 setName newRuleName rule = rule { ruleName = newRuleName}
84 setLHS :: Network g n e -> INRule g n e -> INRule g n e
85 setLHS newRuleLHS rule = rule { ruleLHS = newRuleLHS}
87 setRHS :: Network g n e -> INRule g n e -> INRule g n e
88 setRHS newRuleRHS rule = rule { ruleRHS = newRuleRHS}
90 setMapping :: Mapping -> INRule g n e -> INRule g n e
91 setMapping newRuleMaps rule = rule { ruleMaps = newRuleMaps}
93 construct :: String -- ^ rule name
94 -> Network g n e -- ^ lhs
95 -> Network g n e -- ^ rhs
96 -> Mapping -- ^ correspondences between
97 -- lhs and rhs interface
99 construct theRuleName lhs rhs mapping =
100 INRule { ruleName = theRuleName
106 -- update LHS and RHS networks and mapping
108 updateLHS :: (Network g n e -> Network g n e)
109 -> INRule g n e -> INRule g n e
110 updateLHS networkFun rule = rule { ruleLHS = networkFun $ ruleLHS rule }
112 updateRHS :: (Network g n e -> Network g n e)
113 -> INRule g n e -> INRule g n e
114 updateRHS networkFun rule = rule { ruleRHS = networkFun $ ruleRHS rule }
116 updateMapping :: (Mapping -> Mapping)
117 -> INRule g n e -> INRule g n e
118 updateMapping mapFun rule = rule { ruleMaps = mapFun $ ruleMaps rule }
120 copyLHS2RHS :: INRule g n e -> INRule g n e
123 , ruleMaps = map (diag . fst) . filter isInterfaceNode $ getNodeAssocs lhs
125 where lhs = ruleLHS rule
127 copyLHSInterface2RHS :: INRule g n e -> INRule g n e
128 copyLHSInterface2RHS rule =
129 rule { ruleRHS = setNodeAssocs lhs' . emptyNodesAndEdges $ ruleRHS rule
130 , ruleMaps = map (diag . fst) $ lhs'
132 where lhs' = filter isInterfaceNode . getNodeAssocs $ ruleLHS rule
133 emptyNodesAndEdges net = net { networkNodes = IntMap.empty
134 , networkEdges = IntMap.empty }
136 -- operations on Mappings
137 addMapping :: MappingElement -> Mapping -> Mapping
140 -- auxiliar functions
141 isInterfaceNode :: (NodeNr, Node n) -> Bool
142 isInterfaceNode (_, node) = getShape node == interName
143 where (interName, interDef) = interfaceSymbol