aboutsummaryrefslogtreecommitdiff
path: root/sucl
diff options
context:
space:
mode:
Diffstat (limited to 'sucl')
-rw-r--r--sucl/graph.dcl16
-rw-r--r--sucl/graph.icl55
2 files changed, 37 insertions, 34 deletions
diff --git a/sucl/graph.dcl b/sucl/graph.dcl
index 50cf702..1ed9c29 100644
--- a/sucl/graph.dcl
+++ b/sucl/graph.dcl
@@ -99,31 +99,31 @@ Implementation
emptygraph :: Graph .sym .var
// Assign a node to a variable in a graph.
-updategraph :: .var (Node .sym .var) (Graph .sym .var) -> Graph .sym .var
+updategraph :: var .(Node sym var) !.(Graph sym var) -> .Graph sym var
// Unassign a variable in a graph, making it free.
-prunegraph :: .var (Graph .sym .var) -> Graph .sym .var
+prunegraph :: var !.(Graph sym var) -> .Graph sym var
// Restrict a graph to a given domain, i.e.
// make all variables free except those in the domain.
-restrictgraph :: !.[var] .(Graph sym var) -> Graph sym var | == var
+restrictgraph :: .[var] .(Graph sym var) -> .Graph sym var | == var
// Redirect references (node arguments) in a graph
// according to a redirection function
-redirectgraph :: (.var->.var) !(Graph .sym .var) -> Graph .sym .var | == var
+redirectgraph :: (var->var) !.(Graph sym var) -> .Graph sym var
// Overwrite the variables in the second graph by their contents in the first.
// Keeps the contents of the second graph if free in the first.
-overwritegraph :: !(Graph .sym .var) (Graph .sym .var) -> Graph .sym .var
+overwritegraph :: !.(Graph sym var) !.(Graph sym var) -> .Graph sym var
// Movegraph moves a graph to a different variable domain
// Requires a list of bound variables in the graph
-movegraph :: (var1->.var2) !.[var1] .(Graph sym var1) -> Graph sym .var2 | == var1
+movegraph :: (var1->var2) !.[var1] .(Graph sym var1) -> .Graph sym var2 | == var1
// Varcontents obtains the contents of a variable in a graph
// Returns a boolean determining if it's bound, and
// its contents if the boolean is True.
-varcontents :: !(Graph .sym var) var -> (.Bool,Node .sym var) | == var
+varcontents :: !.(Graph sym var) var -> (.Bool,Node sym var) | == var
// Graphvars determines the top-level-bound and free variables in a graph,
// reachable from a given list of variables.
@@ -213,3 +213,5 @@ compilegraph :: ![(var,Node sym var)] -> Graph sym var
> where (sdef,scont) = nodecontents sgraph snode
*/
+
+instance == (Graph sym var) | == sym & == var
diff --git a/sucl/graph.icl b/sucl/graph.icl
index 3d19159..40d153e 100644
--- a/sucl/graph.icl
+++ b/sucl/graph.icl
@@ -21,7 +21,7 @@ functions to manipulate them.
// A mapping from variables to nodes (unrooted)
:: Graph sym var
- :== Pfun var (Node sym var)
+ = GraphAlias !(Pfun var (Node sym var))
// A node, bearing the contents of a variable
:: Node sym var
@@ -60,25 +60,25 @@ functions to manipulate them.
// The empty set of bindings
emptygraph :: Graph .sym .var
-emptygraph = emptypfun
+emptygraph = GraphAlias emptypfun
-updategraph :: .var (Node .sym .var) (Graph .sym .var) -> Graph .sym .var
-updategraph var node graph = extend var node graph
+updategraph :: var .(Node sym var) !.(Graph sym var) -> .Graph sym var
+updategraph var node graph = mapgraph (extend var node) graph
-prunegraph :: .var (Graph .sym .var) -> Graph .sym .var
-prunegraph var graph = restrict var graph
+prunegraph :: var !.(Graph sym var) -> .Graph sym var
+prunegraph var graph = mapgraph (restrict var) graph
-restrictgraph :: !.[var] .(Graph sym var) -> Graph sym var | == var
-restrictgraph vars graph = domres vars graph
+restrictgraph :: .[var] .(Graph sym var) -> .Graph sym var | == var
+restrictgraph vars graph = mapgraph (domres vars) graph
-redirectgraph :: (.var->.var) !(Graph .sym .var) -> Graph .sym .var | == var
+redirectgraph :: (var->var) !.(Graph sym var) -> .Graph sym var
redirectgraph redirection graph
-= postcomp (mapsnd (map redirection)) graph
+= mapgraph (postcomp (mapsnd (map redirection))) graph
-overwritegraph :: !(Graph .sym .var) (Graph .sym .var) -> Graph .sym .var
-overwritegraph newgraph oldgraph = overwrite newgraph oldgraph
+overwritegraph :: !.(Graph sym var) !.(Graph sym var) -> .Graph sym var
+overwritegraph (GraphAlias newpf) oldgraph = mapgraph (overwrite newpf) oldgraph
-movegraph :: (var1->.var2) !.[var1] .(Graph sym var1) -> Graph sym .var2 | == var1
+movegraph :: (var1->var2) !.[var1] .(Graph sym var1) -> .Graph sym var2 | == var1
movegraph movevar varspace oldgraph
= foldr addvar emptygraph varspace
where addvar var
@@ -87,17 +87,9 @@ movegraph movevar varspace oldgraph
= id
where (def,(sym,args)) = varcontents oldgraph var
-/*
-> nodecontents
-> = total (False,(nosym,noargs)).postcomp s
-> where s x = (True,x)
-> nosym = error "nodecontents: getting symbol of open node"
-> noargs = error "nodecontents: getting arguments of open node"
-*/
-
-varcontents :: !(Graph .sym var) var -> (.Bool,Node .sym var) | == var
-varcontents g v
-= (total (False,(nosym,noargs)) o postcomp found) g v
+varcontents :: !.(Graph sym var) var -> (.Bool,Node sym var) | == var
+varcontents (GraphAlias pfun) v
+= (total (False,(nosym,noargs)) o postcomp found) pfun v
where found x = (True,x)
nosym = abort "varcontents: getting symbol of free variable"
noargs = abort "varcontents: getting arguments of free variable"
@@ -193,9 +185,6 @@ inccounter m f n = if (n==m) (f n+1) (f n)
Compilegraph compiles a graph from parts.
Uses in Miranda:
* reading a parsed program from a file.
-
-> compilegraph :: [(**,(*,[**]))] -> graph * **
-> compilegraph = foldr (uncurry updategraph) emptygraph
*/
compilegraph :: ![(var,Node sym var)] -> Graph sym var
@@ -385,3 +374,15 @@ but there doesn't seem to be any other definition of it.
> where (sdef,scont) = nodecontents sgraph snode
*/
+
+mapgraph ::
+ !( (Pfun var1 (sym1,[var1]))
+ -> Pfun .var2 (.sym2,[.var2])
+ )
+ !.(Graph sym1 var1)
+ -> Graph .sym2 .var2
+mapgraph f (GraphAlias pfun) = GraphAlias (f pfun)
+
+instance == (Graph sym var) | == sym & == var
+where (==) pf1 pf2
+ = pf1 == pf2