aboutsummaryrefslogtreecommitdiff
path: root/sucl/spine.icl
diff options
context:
space:
mode:
Diffstat (limited to 'sucl/spine.icl')
-rw-r--r--sucl/spine.icl381
1 files changed, 0 insertions, 381 deletions
diff --git a/sucl/spine.icl b/sucl/spine.icl
deleted file mode 100644
index cf81386..0000000
--- a/sucl/spine.icl
+++ /dev/null
@@ -1,381 +0,0 @@
-implementation module spine
-
-// $Id$
-
-import history
-import rule
-import dnc
-import graph
-import pfun
-import basic
-from general import No,Yes
-import StdEnv
-
-/*
-
-spine.lit - The extended functional strategy
-============================================
-
-Description
------------
-
-This script implements the strategy answer, and a function to compute it
-for a given graph in a rewrite system.
-
-The strategy answer is a spine -- in principle a colon of partial
-matches from patterns of rewrite rules to the graph, with at the bottom
-the insteresting part: a redex, an open node or something else. See the
-definition of subspine for that.
-
-The strategy function attempts to find a redex to reduce the graph to
-normal form instead of root normal form. This is done by applying a
-root normal form strategy recursively in preorder over the graph (of
-course ignoring cycles). The node at which the root normal form
-strategy was applied is returned in the strategy answer, so laziness can
-be preserved.
-
-------------------------------------------------------------
-
-Interface
----------
-
-Exported identifiers:
-
-> %export
-> answer || Strategy answer type
-> foldspine || Higher order general spine folding
-> ifopen || Check for answer indicating Open
-> printanswer || Make a human-readable representation of an answer
-> printspine || Make a human-readable representation of a spine
-> showanswer || Make a representation of an answer
-> showspine || Make a representation of a spine
-> showsubspine || Make a representation of a subspine
-> spine || Colon of partial matches
-> spinenodes || Determine nodes in a spine
-> spinetip || Determine bottom of spine
-> subspine || Bottom of spine
-
-> history || Symbolic reduction history type
-> printhistory || Make a human-readable representation of a history
-> showhistory || Make a representation of a history
-
-Required types:
-
- subspine - rule@rule.lit,rgraph@rule.lit,pfun@pfun.lit
-
-------------------------------------------------------------
-
-Includes
---------
-
-> %include "basic.lit" || optional
-> %include "pfun.lit" || pfun
-> %include "graph.lit" || graph
-> %include "rule.lit" || rgraph rule
-
-------------------------------------------------------------
-
-Implementation
---------------
-
-
-Answer describes the answer of a strategy. Absence of a spine implies
-that the node was in root normal form.
-
-> answer * ** *** == optional (spine * ** ***)
-
-> showanswer showa showb showc = showoptional (showspine showa showb showc)
-> printanswer printa printb printc = foldoptional ["Rnf"] (printspine printa printb printc)
-
-*/
-
-:: Answer sym var pvar
- :== Optional (Spine sym var pvar)
-
-printanswer ::
- (sym->String)
- (var->String)
- (pvar->String)
- String
- -> (Answer sym var pvar)
- *File
- -> .File
- | == var
- & == pvar
-
-printanswer showsym showvar showpvar indent
-= foldoptional (printrnf indent) (printspine showsym showvar showpvar indent)
-
-printrnf indent file = file <<< indent <<< "RNF" <<< nl
-
-/*
-
-Spine describes the spine returned by a strategy. It contains the node
-at which the strategy was applied, and the result for that node.
-
-> spine * ** *** == (**,subspine * ** ***)
-
-> showspine showa showb showc = showpair showb (showsubspine showa showb showc)
-
-> printspine printa printb printc
-> = foldspine pair cycle delta force missingcase open partial unsafe redex strict
-> where pair node (line,lines) = (printb node++" => "++line):lines
-> cycle = ("Cycle",[])
-> delta = ("Delta",[])
-> force lines = ("Force",lines)
-> missingcase = ("MissingCase",[])
-> open rgraph = ("Open "++printrgraph printa printc rgraph,[])
-> partial rule matching lines = ("Partial <fn> "++printrule printa printc rule++' ':printpfun printc printb matching,lines)
-> unsafe rgraph = ("Unsafe "++printrgraph printa printb rgraph,[])
-> redex rule matching = ("Redex <fn> "++printrule printa printc rule++' ':printpfun printc printb matching,[])
-> strict = ("Strict",[])
-
-*/
-
-:: Spine sym var pvar
- :== (var,Subspine sym var pvar)
-
-printspine ::
- (sym->String)
- (var->String)
- (pvar->String)
- String
- -> (Spine sym var pvar)
- *File
- -> .File
- | == var
- & == pvar
-
-printspine showsym showvar showpvar indent
-= foldspine pair cycle delta force missingcase open partial unsafe redex strict
- where pair node (line,printrest) file = printrest (file <<< indent <<< showvar node <<< ": " <<< line <<< nl)
- cycle = ("Cycle",id)
- delta = ("Delta",id)
- force argno printrest = ("Force argument "+++toString argno,printrest)
- missingcase = ("MissingCase",id)
- open rgraph = ("Open "+++hd (printgraphBy showsym showpvar (rgraphgraph rgraph) [rgraphroot rgraph]),id)
- partial rule matching pvar printrest = ("Partial <fn> "+++showruleanch showsym showpvar (repeat False) rule [pvar]+++" <"+++showpvar pvar+++"> "+++showpfun showpvar showvar matching,printrest)
- unsafe rgraph = ("Unsafe "+++hd (printgraphBy showsym showvar (rgraphgraph rgraph) [rgraphroot rgraph]),id)
- redex rule matching = ("Redex <fn> "+++showruleanch showsym showpvar (repeat False) rule []+++" "+++showpfun showpvar showvar matching,id)
- strict = ("Strict",id)
-
-/*
-
-Subspine describes what was the result of the strategy applied to a node
-in a graph.
-
-> subspine * ** ***
-> ::= Cycle | || The spine contains a cycle
-> Delta | || An imported (delta) rule was found
-> Force (spine * ** ***) | || Global strictness annotation forced evaluation of a subgraph
-> MissingCase | || All alternatives failed for a function symbol
-> Open (rgraph * ***) | || Need root normal form of open node for matching
-> Partial (rule * ***) (pfun *** **) (spine * ** ***) | || A rule was strictly partially matched
-> Unsafe (rgraph * **) | || Terminated due to immininent recursion
-> Redex (rule * ***) (pfun *** **) | || Total match
-> Strict || Need root normal form due to strictness
-
-> showsubspine showa showb showc
-> = sh
-> where sh Cycle = "Cycle"
-> sh Delta = "Delta"
-> sh (Force spine) = "(Force "++showspine showa showb showc spine++")"
-> sh MissingCase = "MissingCase"
-> sh (Open rgraph) = "(Open "++showrgraph showa showc rgraph++")"
-> sh (Partial rule matching spine) = "(Partial "++showrule showa showc rule++' ':showpfun showc showb matching++' ':showspine showa showb showc spine++")"
-> sh (Unsafe rgraph) = "(Unsafe "++showrgraph showa showb rgraph++")"
-> sh (Redex rule matching) = "(Redex "++showrule showa showc rule++' ':showpfun showc showb matching++")"
-> sh Strict = "Strict"
-
- printsubspine printa printb printc
- = pr
- where pr Cycle = "Cycle"
- pr Delta = "Delta"
- pr (Force argno spine) = "(Force <argno> "++printspine printa printb printc spine++")"
- pr MissingCase = "MissingCase"
- pr (Open rgraph) = "(Open "++printrgraph printa printc rgraph++")"
- pr (Partial rule matching spine) = "(Partial "++printrule printa printc rule++' ':printpfun printc printb matching++' ':printspine printa printb printc spine++")"
- pr (Unsafe rgraph) = "(Unsafe "++printrgraph printa printb rgraph++")"
- pr (Redex rule matching) = "(Redex "++printrule printa printc rule++' ':printpfun printc printb matching++")"
- pr Strict = "Strict"
-
-*/
-
-:: Subspine sym var pvar
- = Cycle // The spine contains a cycle
- | Delta // An imported (delta) rule was found
- | Force Int (Spine sym var pvar) // Global strictness annotation forced evaluation of a subgraph at specified argument position
- | MissingCase // All alternatives failed for a function symbol
- | Open (Rgraph sym pvar) // Need root normal form of open node for matching
- | Partial (Rule sym pvar) (Pfun pvar var) pvar (Spine sym var pvar) // A rule was strictly partially matched
- | Unsafe (HistoryPattern sym var) // Terminated due to immininent recursion
- | Redex (Rule sym pvar) (Pfun pvar var) // Total match
- | Strict // Need root normal form due to strictness
-
-/*
-
-> foldspine
-> :: (**->****->*****) ->
-> **** ->
-> **** ->
-> (*****->****) ->
-> **** ->
-> (rgraph * ***->****) ->
-> (rule * ***->pfun *** **->*****->****) ->
-> (rgraph * **->****) ->
-> (rule * ***->pfun *** **->****) ->
-> **** ->
-> spine * ** *** ->
-> *****
-
-> foldspine pair cycle delta force missingcase open partial unsafe redex strict
-> = fold
-> where fold (node,subspine) = pair node (foldsub subspine)
-> foldsub Cycle = cycle
-> foldsub Delta = delta
-> foldsub (Force spine) = force (fold spine)
-> foldsub MissingCase = missingcase
-> foldsub (Open rgraph) = open rgraph
-> foldsub (Partial rule matching spine) = partial rule matching (fold spine)
-> foldsub (Unsafe rgraph) = unsafe rgraph
-> foldsub (Redex rule matching) = redex rule matching
-> foldsub Strict = strict
-
-*/
-
-foldspine
- :: !(var .subresult -> .result) // Fold the spine itself
- .subresult // Fold a Cycle subspine
- .subresult // Fold a Delta subspine
- (Int .result -> .subresult) // Fold a Force subspine
- .subresult // Fold a MissingCase subspine
- ((Rgraph sym pvar) -> .subresult) // Fold an Open subspine
- ((Rule sym pvar) (Pfun pvar var) pvar .result -> .subresult) // Fold a Partial subspine
- ((HistoryPattern sym var) -> .subresult) // Fold an Unsafe subspine
- ((Rule sym pvar) (Pfun pvar var) -> .subresult) // Fold a Redex subspine
- .subresult // Fold a Strict subspine
- .(Spine sym var pvar) // The spine to fold
- -> .result // The final result
-
-foldspine pair cycle delta force missingcase open partial unsafe redex strict spine
-= fold spine
- where fold spine
- = pair node (foldsub subspine)
- where (node,subspine) = spine
- foldsub Cycle = cycle
- foldsub Delta = delta
- foldsub (Force argno spine) = force argno (fold spine)
- foldsub MissingCase = missingcase
- foldsub (Open rgraph) = open rgraph
- foldsub (Partial rule matching rnode spine) = partial rule matching rnode (fold spine)
- foldsub (Unsafe histpat) = unsafe histpat
- foldsub (Redex rule matching) = redex rule matching
- foldsub Strict = strict
-
-spinetip :: !(Spine sym var pvar) -> Spine sym var pvar
-spinetip (_,Force argno spine) = spinetip spine
-spinetip (_,Partial _ _ pnode spine) = spinetip spine
-spinetip spine = spine
-
-spinenodes :: .(Spine sym var pvar) -> [var]
-spinenodes spine
-= nodes
- where partial _ _ _ = id
- redex _ _ = []
- nodes = foldspine cons [] [] (const id) [] (const []) partial (const []) redex [] spine
-
-ifopen :: result result !.(Answer sym var pvar) -> result
-ifopen open other spine
-= foldoptional other (checkopen o spinetip) spine
- where checkopen (onode,Open pattern) = open
- checkopen tip = other
-
-
-/*********************************************
-* Extending the history according to a spine *
-*********************************************/
-
-// A function that associates specific patterns with extensible nodes
-// To be used for extending history patterns
-:: LinkExtender sym var
- :== (Link var) // The extensible link to look for
- -> HistoryPattern sym var // The associated pattern
-
-extendhistory
- :: (Graph sym var)
- (var -> var)
- (Spine sym var pvar)
- (History sym var)
- -> History sym var
- | == var
- & == pvar
-
-extendhistory sgraph redirection spine history
-= snd (foldspine (extendpair sgraph redirection) d d (const id) d (const d) (extendpartial sgraph) (const d) (extendredex sgraph history) d spine)
- where d = (emptygraph,history)
-
-
-extendpair
- :: (Graph sym var)
- (var->var)
- var
- (Graph sym var,History sym var)
- -> (Graph sym var,History sym var)
- | == var
-
-extendpair sgraph redirect snode (hgraph,history)
-= (hgraph`,remap (redirect snode) [mkrgraph snode hgraph`:foldmap id [] history snode] (forget snode history))
- where hgraph` = if sdef (updategraph snode scont hgraph) hgraph
- (sdef,scont) = dnc (const "in extendpair") sgraph snode
-
-extendpartial
- :: (Graph sym var)
- (Rule sym pvar)
- (Pfun pvar var)
- pvar
- (Graph sym var,History sym var)
- -> (Graph sym var,History sym var)
- | == var
- & == pvar
-
-extendpartial sgraph rule matching rnode (hgraph,history)
-= (extgraph` sgraph rule matching hgraph,history)
-
-extendredex
- :: (Graph sym var)
- (History sym var)
- (Rule sym pvar)
- (Pfun pvar var)
- -> (Graph sym var,History sym var)
- | == var
- & == pvar
-
-extendredex sgraph history rule matching
-= (extgraph` sgraph rule matching emptygraph,history)
-
-extgraph` :: (Graph sym var) (Rule sym pvar) -> (Pfun pvar var) (Graph sym var) -> Graph sym var | == var & == pvar
-extgraph` sgraph rule
-= extgraph sgraph rgraph (varlist rgraph (arguments rule))
- where rgraph = rulegraph rule
-
-(writeanswer) infixl :: *File (Answer sym var pvar) -> .File | toString sym & ==,toString,<<< var // & ==,toString,<<< pvar
-(writeanswer) file No = file <<< "<root-normal-form>" <<< nl
-(writeanswer) file (Yes spine) = file writespine spine <<< nl
-
-(writespine) infixl :: *File (Spine sym var pvar) -> .File | toString sym & ==,toString,<<< var // & ==,toString,<<< pvar
-(writespine) file (var,subspine) = file <<< "(" <<< var <<< "," <<< subspine <<< ")"
-
-instance <<< (Subspine sym var pvar) | toString sym & ==,toString,<<< var // & ==,toString,<<< pvar
-where
-/*
- (<<<) file _ = file <<< "<subspine>"
-*/
- (<<<) file Cycle = file <<< "Cycle"
- (<<<) file Delta = file <<< "Delta"
- (<<<) file (Force argno spine) = file <<< "Force " <<< argno <<< " " writespine spine
- (<<<) file MissingCase = file <<< "MissingCase"
- (<<<) file (Open pattern) = file <<< "Open <rgraph>"
- (<<<) file (Partial rule matching focus spine) = file <<< "Partial {rule=<Rule sym pvar>, matching=<Pfun pvar var>, focus=<pvar>, spine=" writespine spine <<< "}"
- (<<<) file (Unsafe pattern) = file <<< "Unsafe " writergraph pattern
- (<<<) file (Redex rule matching) = file <<< "Redex {rule=<Rule sym pvar>, matching=<Pfun pvar var>}"
- (<<<) file Strict = file <<< "Strict"