diff options
-rw-r--r-- | sucl/rule.dcl | 11 | ||||
-rw-r--r-- | sucl/rule.icl | 31 |
2 files changed, 27 insertions, 15 deletions
diff --git a/sucl/rule.dcl b/sucl/rule.dcl index f66ca6e..e7b408c 100644 --- a/sucl/rule.dcl +++ b/sucl/rule.dcl @@ -3,6 +3,7 @@ definition module rule // $Id$ from graph import Graph,Node +from StdOverloaded import == // --- Exported types @@ -29,16 +30,18 @@ rulegraph :: !(Rule .sym .var) -> Graph .sym .var emptyrgraph :: .var -> Rgraph .sym .var // Update the contents of a variable in a rooted graph -updatergraph :: .var (Node .sym .var) !(Rgraph .sym .var) -> Rgraph .sym .var +updatergraph :: var .(Node sym var) !.(Rgraph sym var) -> .Rgraph sym var // Prune a rooted graph at a variable (making it free) -prunergraph :: .var !(Rgraph .sym .var) -> Rgraph .sym .var +prunergraph :: var !.(Rgraph sym var) -> .Rgraph sym var // Get the root of a rooted graph -rgraphroot :: !(Rgraph .sym .var) -> .var +rgraphroot :: !.(Rgraph sym var) -> var // Get the graph part of a rooted graph -rgraphgraph :: !(Rgraph .sym .var) -> Graph .sym .var +rgraphgraph :: !.(Rgraph sym var) -> Graph sym var // Build a rooted graph from a root and a graph mkrgraph :: .var (Graph .sym .var) -> Rgraph .sym .var + +instance == (Rgraph sym var) | == sym & == var diff --git a/sucl/rule.icl b/sucl/rule.icl index 84b89d3..24c2e46 100644 --- a/sucl/rule.icl +++ b/sucl/rule.icl @@ -4,12 +4,13 @@ implementation module rule import graph import basic +import StdEnv :: Rule sym var :== ([var],var,Graph sym var) :: Rgraph sym var - :== (var,Graph sym var) + = RgraphAlias var (Graph sym var) /* @@ -111,22 +112,26 @@ Rooted graphs */ emptyrgraph :: .var -> Rgraph .sym .var -emptyrgraph root = (root,emptygraph) +emptyrgraph root = RgraphAlias root emptygraph -updatergraph :: .var (Node .sym .var) !(Rgraph .sym .var) -> Rgraph .sym .var -updatergraph var node rgraph = mapsnd (updategraph var node) rgraph +updatergraph :: var .(Node sym var) !.(Rgraph sym var) -> .Rgraph sym var +updatergraph var node rgraph = maprgraph (mapsnd (updategraph var node)) rgraph -prunergraph :: .var !(Rgraph .sym .var) -> Rgraph .sym .var -prunergraph var rgraph = mapsnd (prunegraph var) rgraph +prunergraph :: var !.(Rgraph sym var) -> .Rgraph sym var +prunergraph var rgraph = maprgraph (mapsnd (prunegraph var)) rgraph -rgraphroot :: !(Rgraph .sym .var) -> .var -rgraphroot (root,_) = root +rgraphroot :: !.(Rgraph sym var) -> var +rgraphroot (RgraphAlias root _) = root -rgraphgraph :: !(Rgraph .sym .var) -> Graph .sym .var -rgraphgraph (_,graph) = graph +rgraphgraph :: !.(Rgraph sym var) -> Graph sym var +rgraphgraph (RgraphAlias _ graph) = graph mkrgraph :: .var (Graph .sym .var) -> Rgraph .sym .var -mkrgraph root graph = (root,graph) +mkrgraph root graph = RgraphAlias root graph + +maprgraph :: (.(var1,Graph sym1 var1) -> (.var2,Graph .sym2 .var2)) !.(Rgraph sym1 var1) -> Rgraph .sym2 .var2 +maprgraph f (RgraphAlias root1 graph1) = RgraphAlias root2 graph2 + where (root2,graph2) = f (root1,graph1) /* > showrgraph showfunc shownode (root,graph) @@ -189,3 +194,7 @@ rulegraph (_,_,graph) = graph > compilerule args root = mkrule args root.compilegraph */ + +instance == (Rgraph sym var) | == sym & == var +where (==) (RgraphAlias root1 graph1) (RgraphAlias root2 graph2) + = root1==root2 && graph1==graph2 |