aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sucl/Makefile2
-rw-r--r--sucl/history.dcl18
-rw-r--r--sucl/history.icl283
-rw-r--r--sucl/loop.dcl1
-rw-r--r--sucl/loop.icl9
-rw-r--r--sucl/spine.dcl17
-rw-r--r--sucl/spine.icl314
-rw-r--r--sucl/strat.dcl1
-rw-r--r--sucl/strat.icl45
-rw-r--r--sucl/trace.dcl2
10 files changed, 348 insertions, 344 deletions
diff --git a/sucl/Makefile b/sucl/Makefile
index 4237b18..7f462df 100644
--- a/sucl/Makefile
+++ b/sucl/Makefile
@@ -6,7 +6,7 @@ COCL = cocl
#COCLFLAGS = -lat
SYS = Clean\ System\ Files
-MODULES = basic pretty pfun graph dnc rule trd rewr complete spine history trace absmodule spine strat loop law coreclean convert supercompile
+MODULES = basic pretty pfun graph dnc rule trd rewr complete history spine trace absmodule spine strat loop law coreclean convert supercompile
ABC = $(patsubst %,$(SYS)/%.abc,$(MODULES))
diff --git a/sucl/history.dcl b/sucl/history.dcl
index 0d9ba86..d2f68a4 100644
--- a/sucl/history.dcl
+++ b/sucl/history.dcl
@@ -2,15 +2,10 @@ definition module history
// $Id$
-from spine import Spine
from graph import Graph
from general import Optional
from StdOverloaded import ==
-// Transitive necessities
-
-from spine import Subspine
-
// A history relates node-ids in the subject graph to patterns
:: History sym var
:== [HistoryAssociation sym var]
@@ -23,22 +18,15 @@ from spine import Subspine
// A pattern in the history, specifying the most general subject graph (footprint) for a reduction sequence
:: HistoryPattern sym var
+ = Closed sym [HistoryPattern sym var] // Indicates a closed node-id in the subject graph (created by a (partial) match)
+ | OpenHist // Indicates an open node-id in the subject graph (created by instantiation)
+ | Extensible (Link var) // Indicates a link to an untouched node-id in the subject graph, where this pattern can be extended
// A link in a graph, indicated by its source node-id and the argument number
// The root of a graph can be indicated by the No constructor
:: Link var
:== Optional (var,Int)
-// Extend the history according to a spine
-extendhistory
- :: (Graph sym var) // Subject graph
- (Spine sym var pvar) // Spine leading to the reduction operation
- (History sym var) // Old history
- -> History sym var // New history
- | == sym
- & == var
- & == pvar
-
// Check the current subject graph in the history
matchhistory
:: (History sym var) // Complete history against which to check
diff --git a/sucl/history.icl b/sucl/history.icl
index 2482b5a..4ece980 100644
--- a/sucl/history.icl
+++ b/sucl/history.icl
@@ -32,279 +32,6 @@ import StdEnv
:== Optional (var,Int)
-/*********************************************
-* 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) // Subject graph
- (Spine sym var pvar) // Spine leading to the reduction operation
- (History sym var) // Old history
- -> History sym var // New history
- | == sym
- & == var
- & == pvar
-
-extendhistory sgraph spine history
- = [newpattern:touchmod history]
- where (newpattern,_,extender)
- = foldspine extendpair extenddefault extenddefault (extendforce sgraph) extenddefault extendopen (extendpartial sgraph) (const extenddefault) (extendredex sgraph) extenddefault spine No Extensible
- touchmod = map (mapsnd (patextend extender))
-
-patextend
- :: (LinkExtender sym var)
- (HistoryPattern sym var)
- -> HistoryPattern sym var
-
-patextend extender (Closed sym args) = Closed sym (map (patextend extender) args)
-patextend extender OpenHist = OpenHist
-patextend extender (Extensible link) = extender link
-
-extendpair
- :: var // Subject node-id where spine is rooted
- ( var
- (Link var)
- (LinkExtender sym var)
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var
- , LinkExtender sym var
- )
- )
- (Link var) // Link in subject graph to this spine
- (LinkExtender sym var) // Input link extender
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Returned history pattern
- , LinkExtender sym var // Returned link extender
- )
-
-extendpair snode extendsub link extender
- = extendsub snode link extender
-
-extenddefault
- :: var
- (Link var)
- (LinkExtender sym var)
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var
- , LinkExtender sym var
- )
-extenddefault _ link extender
- = (nonewpattern,Extensible link,extender)
- where nonewpattern = abort "history: extenddefault: no new pattern for default spine"
-
-// Extend history for a Force spine
-// FIXME: For now, only look at function node and to-be-strict argument
-// Forget what was already determined strict
-extendforce
- :: (Graph sym var)
- Int
- ( (Link var)
- (LinkExtender sym var)
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var
- , LinkExtender sym var
- )
- )
- var
- (Link var)
- (LinkExtender sym var)
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var
- , LinkExtender sym var
- )
- | == var
-
-extendforce sgraph argno forcesub snode link extender0
- | not sdef
- = abort "history: extendforce: force from open node-id???"
- = (newpattern,histpat1,extender2)
- where (newpattern,histpat0,extender1) = forcesub (Yes (snode,argno)) extender0
- histpat1 = Closed ssym [argpat i \\ i <- [0..] & _ <- sargs]
- argpat i
- = if (i==argno) histpat0 (Extensible (Yes (snode,i)))
- (sdef,(ssym,sargs)) = varcontents sgraph snode
- extender2 = adjust link histpat1 extender1
-
-// Extend history patterns according to an Open spine
-extendopen
- :: rgraph // Pattern to drive instantiation (not used)
- var // Node-id in subject graph that was open
- (Link var) // Where subject graph pointed to this open node-id
- (LinkExtender sym var) // Input link extender
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Pattern for this spine
- , LinkExtender sym var // Resulting link extender
- )
- | == var
-
-extendopen _ snode link extender0
- = (newpattern,histpat,extender1)
- where histpat = OpenHist
- newpattern = (snode,histpat)
- extender1 = adjust link histpat extender0
-
-extendpartial
- :: (Graph sym var) // Subject graph
- (Rule sym pvar) // Applied rewrite rule
- (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
- pvar // Node-id in rule where partial match went to subspine
- ( (Link var) // Link passed to subspine handler
- (LinkExtender sym var) // Link extender input to subspine handler
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Pattern returned for subspine
- , LinkExtender sym var // Link extender returned for subspine
- )
- )
- var // Node-id in subject with function application
- (Link var) // Link to root of partial match in subject graph
- (LinkExtender sym var) // Remaining link extender
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // History patterns with derived pattern prefixed
- , LinkExtender sym var // Extended link extender
- )
- | == sym
- & == var
- & == pvar
-
-extendpartial sgraph rule matching subnode extendsub snode link restextender
- = extendfunction sgraph rule matching ((==)subnode) (const extendsub) snode link restextender
-
-extendredex
- :: (Graph sym var) // Subject graph
- (Rule sym pvar) // Applied rewrite rule
- (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
- var // Root of redex in subject graph
- (Link var) // Link to root of redex in subject graph
- (LinkExtender sym var) // Remaining link extender
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // History patterns with derived pattern prefixed
- , LinkExtender sym var // Extended link extender
- )
- | == sym
- & == var
- & == pvar
-
-extendredex sgraph rule matching snode link extender
- = extendfunction sgraph rule matching (const False) nosub snode link extender
- where nosub = abort "history: extendredex: full match with subspine??"
-
-extendfunction
- :: (Graph sym var) // Subject graph
- (Rule sym pvar) // Applied rewrite rule
- (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
- (pvar -> Bool) // Checks whether the subspine applies here
- ( (HistoryAssociation sym var)
- (Link var) // Link passed to subspine handler
- (LinkExtender sym var) // Link extender input to subspine handler
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Pattern returned for subspine
- , LinkExtender sym var // Link extender returned for subspine
- )
- )
- var // Root of partial match in subject graph
- (Link var) // Link to root of partial match in subject graph
- (LinkExtender sym var) // Remaining link extender
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // History patterns with derived pattern prefixed
- , LinkExtender sym var // Extended link extender
- )
- | == sym
- & == var
- & == pvar
-
-extendfunction sgraph rule matching issub extendsub snode link extender0
- | not sdef
- = abort "history: extendfunction: partial or full match at open node-id???"
- = (newpattern,thispat,extender2)
- where extender2 = adjust link thispat extender1
- thispat = Closed ssym argpatts
- (newpattern,argpatts,extender1) = extendnodes sgraph rgraph matching snode issub extendsub thisnewpattern extender0 rargs
- (sdef,(ssym,_)) = varcontents sgraph snode
- rgraph = rulegraph rule
- rargs = arguments rule
- thisnewpattern = (snode,thispat)
-
-extendnodes
- :: (Graph sym var) // Subject graph
- (Graph sym pvar) // Applied rewrite rule
- (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
- var // Parent node-id in subject graph to this node-id list for creating links
- (pvar -> Bool) // Tells if this is where the subspine was attached
- ( (HistoryAssociation sym var)
- (Link var) // Link passed to subspine handler
- (LinkExtender sym var) // Link extender input to subspine handler
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Pattern returned for subspine
- , LinkExtender sym var // Link extender returned for subspine
- )
- )
- (HistoryAssociation sym var)
- (LinkExtender sym var) // Remaining link extender
- [pvar] // Node-ids in rule to handle
- -> ( HistoryAssociation sym var
- , [HistoryPattern sym var] // History patterns with derived pattern prefixed
- , LinkExtender sym var // Extended link extender
- )
- | == sym
- & == var
- & == pvar
-
-extendnodes sgraph rgraph matching sparent issub extendsub newpattern restextender rnodes
- = foldr (extendnode sgraph rgraph matching issub extendsub) (newpattern,[],restextender) (zip2 links rnodes)
- where links = [Yes (sparent,i)\\i<-[0..]]
-
-extendnode
- :: (Graph sym var) // Subject graph
- (Graph sym pvar) // Applied rewrite rule
- (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
- (pvar -> Bool) // Tells if this is where the subspine was attached
- ( (HistoryAssociation sym var)
- (Link var) // Link passed to subspine handler
- (LinkExtender sym var) // Link extender input to subspine handler
- -> ( HistoryAssociation sym var
- , HistoryPattern sym var // Pattern returned for subspine
- , LinkExtender sym var // Link extender returned for subspine
- )
- )
- ( Link var // Referring link to current node-id
- , pvar // Current node-id in rule
- )
- ( HistoryAssociation sym var
- , [HistoryPattern sym var] // History patterns to prefix derived patterns to
- , (LinkExtender sym var) // Remaining link extender
- )
- -> ( HistoryAssociation sym var
- , [HistoryPattern sym var] // History patterns with derived pattern prefixed
- , (LinkExtender sym var) // Extended link extender
- )
- | == sym
- & == var
- & == pvar
-
-extendnode sgraph rgraph matching issub extendsub (link,rnode) (newpattern0,rest,extender0)
- | issub rnode
- = (subnewpattern,[subpattern:rest],subextender)
- | rdef
- = foldpfun mapped unmapped matching rnode
- = unmapped
- where (subnewpattern,subpattern,subextender)
- = extendsub newpattern0 link extender0
- mapped snode
- = (newpattern1,[thispat:rest],extender2)
- where extender2 = adjust link thispat extender1
- thispat = Closed rsym argpatts
- (newpattern1,argpatts,extender1) = extendnodes sgraph rgraph matching snode issub extendsub newpattern0 extender0 rargs
- unmapped
- = (newpattern0,[Extensible link:rest],extender0)
- (rdef,(rsym,rargs)) = varcontents rgraph rnode
-
-
/************************************************
* Verifying a subject graph against the history *
************************************************/
@@ -334,13 +61,3 @@ checkpat sgraph OpenHist snode
= not (fst (varcontents sgraph snode))
checkpat _ (Extensible _) _
= True
-
-
-/****************
-* Miscellaneous *
-****************/
-
-instance == (Optional a) | == a
- where (==) No No = True
- (==) (Yes x1) (Yes x2) = x1==x2
- (==) _ _ = False
diff --git a/sucl/loop.dcl b/sucl/loop.dcl
index f4821fe..2fcbe3f 100644
--- a/sucl/loop.dcl
+++ b/sucl/loop.dcl
@@ -5,6 +5,7 @@ definition module loop
from strat import Strategy
from spine import Answer
from trace import Trace
+from history import HistoryAssociation,HistoryPattern
from rule import Rgraph,Rule
from graph import Graph
from StdOverloaded import ==
diff --git a/sucl/loop.icl b/sucl/loop.icl
index 0ecb18d..c94c1b6 100644
--- a/sucl/loop.icl
+++ b/sucl/loop.icl
@@ -132,7 +132,8 @@ transform
[var] // Arguments of function to generate
!(Answer sym var pvar) // Result of strategy
-> Action sym var pvar
- | == var
+ | == sym
+ & == var
& == pvar
transform anode sargs (Yes spine)
@@ -209,7 +210,8 @@ tryunfold
(Pfun pvar var) // The matching from rule's pattern to subject
(Spine sym var pvar) // The spine returned by the strategy
-> Action sym var pvar
- | == var
+ | == sym
+ & == var
& == pvar
tryunfold redexroot rule matching spine
@@ -220,8 +222,7 @@ tryunfold redexroot rule matching spine
= xunfold redexroot rule (heap,sroot,subject,matching)
noredir = abort "transtree: no mapping foor root of replacement"
reductroot = total noredir matching` (ruleroot rule)
- redirect = adjust redexroot reductroot id
- history` = extendhistory subject redirect spine history
+ history` = extendhistory subject spine history
trace = continue history` failinfo instdone stricts sroot` subject` heap`
tryannotate
diff --git a/sucl/spine.dcl b/sucl/spine.dcl
index fb7b784..f45a0f5 100644
--- a/sucl/spine.dcl
+++ b/sucl/spine.dcl
@@ -2,9 +2,12 @@ definition module spine
// $Id$
+from history import History,HistoryAssociation,HistoryPattern
from rule import Rgraph,Rule
+from graph import Graph
from pfun import Pfun
from general import Optional
+from StdOverloaded import ==
/*
@@ -163,7 +166,7 @@ in a graph.
| 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 (Rgraph sym var) // Terminated due to immininent recursion
+ | 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
@@ -176,7 +179,7 @@ foldspine
.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
- ((Rgraph sym var) -> .subresult) // Fold an Unsafe 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
@@ -193,3 +196,13 @@ spinenodes :: .(Spine sym var pvar) -> [var]
// Make a decision (continuation based) on whether a spine ends in Open
ifopen :: result result !.(Answer sym var pvar) -> result
+
+// Extend the history according to a spine
+extendhistory
+ :: (Graph sym var) // Subject graph
+ (Spine sym var pvar) // Spine leading to the reduction operation
+ (History sym var) // Old history
+ -> History sym var // New history
+ | == sym
+ & == var
+ & == pvar
diff --git a/sucl/spine.icl b/sucl/spine.icl
index 930ffc7..89da146 100644
--- a/sucl/spine.icl
+++ b/sucl/spine.icl
@@ -2,9 +2,12 @@ implementation module spine
// $Id$
+import history
import rule
+import graph
import pfun
import basic
+from general import No,Yes
import StdEnv
/*
@@ -164,7 +167,7 @@ in a graph.
| 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 (Rgraph sym var) // Terminated due to immininent recursion
+ | 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
@@ -200,18 +203,18 @@ in a graph.
*/
foldspine
- :: !(var .subresult -> .result)
- .subresult
- .subresult
- (Int .result -> .subresult)
- .subresult
- ((Rgraph sym pvar) -> .subresult)
- ((Rule sym pvar) (Pfun pvar var) pvar .result -> .subresult)
- ((Rgraph sym var) -> .subresult)
- ((Rule sym pvar) (Pfun pvar var) -> .subresult)
- .subresult
- .(Spine sym var pvar)
- -> .result
+ :: !(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
@@ -224,7 +227,7 @@ foldspine pair cycle delta force missingcase open partial unsafe redex strict sp
foldsub MissingCase = missingcase
foldsub (Open rgraph) = open rgraph
foldsub (Partial rule matching rnode spine) = partial rule matching rnode (fold spine)
- foldsub (Unsafe rgraph) = unsafe rgraph
+ foldsub (Unsafe histpat) = unsafe histpat
foldsub (Redex rule matching) = redex rule matching
foldsub Strict = strict
@@ -244,3 +247,286 @@ 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) // Subject graph
+ (Spine sym var pvar) // Spine leading to the reduction operation
+ (History sym var) // Old history
+ -> History sym var // New history
+ | == sym
+ & == var
+ & == pvar
+
+extendhistory sgraph spine history
+ = [newpattern:touchmod history]
+ where (newpattern,_,extender)
+ = foldspine extendpair extenddefault extenddefault (extendforce sgraph) extenddefault extendopen (extendpartial sgraph) (const extenddefault) (extendredex sgraph) extenddefault spine No Extensible
+ touchmod = map (mapsnd (patextend extender))
+
+patextend
+ :: (LinkExtender sym var)
+ (HistoryPattern sym var)
+ -> HistoryPattern sym var
+
+patextend extender (Closed sym args) = Closed sym (map (patextend extender) args)
+patextend extender OpenHist = OpenHist
+patextend extender (Extensible link) = extender link
+
+extendpair
+ :: var // Subject node-id where spine is rooted
+ ( var
+ (Link var)
+ (LinkExtender sym var)
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var
+ , LinkExtender sym var
+ )
+ )
+ (Link var) // Link in subject graph to this spine
+ (LinkExtender sym var) // Input link extender
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Returned history pattern
+ , LinkExtender sym var // Returned link extender
+ )
+
+extendpair snode extendsub link extender
+ = extendsub snode link extender
+
+extenddefault
+ :: var
+ (Link var)
+ (LinkExtender sym var)
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var
+ , LinkExtender sym var
+ )
+extenddefault _ link extender
+ = (nonewpattern,Extensible link,extender)
+ where nonewpattern = abort "history: extenddefault: no new pattern for default spine"
+
+// Extend history for a Force spine
+// FIXME: For now, only look at function node and to-be-strict argument
+// Forget what was already determined strict
+extendforce
+ :: (Graph sym var)
+ Int
+ ( (Link var)
+ (LinkExtender sym var)
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var
+ , LinkExtender sym var
+ )
+ )
+ var
+ (Link var)
+ (LinkExtender sym var)
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var
+ , LinkExtender sym var
+ )
+ | == var
+
+extendforce sgraph argno forcesub snode link extender0
+ | not sdef
+ = abort "history: extendforce: force from open node-id???"
+ = (newpattern,histpat1,extender2)
+ where (newpattern,histpat0,extender1) = forcesub (Yes (snode,argno)) extender0
+ histpat1 = Closed ssym [argpat i \\ i <- [0..] & _ <- sargs]
+ argpat i
+ = if (i==argno) histpat0 (Extensible (Yes (snode,i)))
+ (sdef,(ssym,sargs)) = varcontents sgraph snode
+ extender2 = adjust link histpat1 extender1
+
+// Extend history patterns according to an Open spine
+extendopen
+ :: rgraph // Pattern to drive instantiation (not used)
+ var // Node-id in subject graph that was open
+ (Link var) // Where subject graph pointed to this open node-id
+ (LinkExtender sym var) // Input link extender
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Pattern for this spine
+ , LinkExtender sym var // Resulting link extender
+ )
+ | == var
+
+extendopen _ snode link extender0
+ = (newpattern,histpat,extender1)
+ where histpat = OpenHist
+ newpattern = (snode,histpat)
+ extender1 = adjust link histpat extender0
+
+extendpartial
+ :: (Graph sym var) // Subject graph
+ (Rule sym pvar) // Applied rewrite rule
+ (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
+ pvar // Node-id in rule where partial match went to subspine
+ ( (Link var) // Link passed to subspine handler
+ (LinkExtender sym var) // Link extender input to subspine handler
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Pattern returned for subspine
+ , LinkExtender sym var // Link extender returned for subspine
+ )
+ )
+ var // Node-id in subject with function application
+ (Link var) // Link to root of partial match in subject graph
+ (LinkExtender sym var) // Remaining link extender
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // History patterns with derived pattern prefixed
+ , LinkExtender sym var // Extended link extender
+ )
+ | == sym
+ & == var
+ & == pvar
+
+extendpartial sgraph rule matching subnode extendsub snode link restextender
+ = extendfunction sgraph rule matching ((==)subnode) (const extendsub) snode link restextender
+
+extendredex
+ :: (Graph sym var) // Subject graph
+ (Rule sym pvar) // Applied rewrite rule
+ (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
+ var // Root of redex in subject graph
+ (Link var) // Link to root of redex in subject graph
+ (LinkExtender sym var) // Remaining link extender
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // History patterns with derived pattern prefixed
+ , LinkExtender sym var // Extended link extender
+ )
+ | == sym
+ & == var
+ & == pvar
+
+extendredex sgraph rule matching snode link extender
+ = extendfunction sgraph rule matching (const False) nosub snode link extender
+ where nosub = abort "history: extendredex: full match with subspine??"
+
+extendfunction
+ :: (Graph sym var) // Subject graph
+ (Rule sym pvar) // Applied rewrite rule
+ (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
+ (pvar -> Bool) // Checks whether the subspine applies here
+ ( (HistoryAssociation sym var)
+ (Link var) // Link passed to subspine handler
+ (LinkExtender sym var) // Link extender input to subspine handler
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Pattern returned for subspine
+ , LinkExtender sym var // Link extender returned for subspine
+ )
+ )
+ var // Root of partial match in subject graph
+ (Link var) // Link to root of partial match in subject graph
+ (LinkExtender sym var) // Remaining link extender
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // History patterns with derived pattern prefixed
+ , LinkExtender sym var // Extended link extender
+ )
+ | == sym
+ & == var
+ & == pvar
+
+extendfunction sgraph rule matching issub extendsub snode link extender0
+ | not sdef
+ = abort "history: extendfunction: partial or full match at open node-id???"
+ = (newpattern,thispat,extender2)
+ where extender2 = adjust link thispat extender1
+ thispat = Closed ssym argpatts
+ (newpattern,argpatts,extender1) = extendnodes sgraph rgraph matching snode issub extendsub thisnewpattern extender0 rargs
+ (sdef,(ssym,_)) = varcontents sgraph snode
+ rgraph = rulegraph rule
+ rargs = arguments rule
+ thisnewpattern = (snode,thispat)
+
+extendnodes
+ :: (Graph sym var) // Subject graph
+ (Graph sym pvar) // Applied rewrite rule
+ (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
+ var // Parent node-id in subject graph to this node-id list for creating links
+ (pvar -> Bool) // Tells if this is where the subspine was attached
+ ( (HistoryAssociation sym var)
+ (Link var) // Link passed to subspine handler
+ (LinkExtender sym var) // Link extender input to subspine handler
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Pattern returned for subspine
+ , LinkExtender sym var // Link extender returned for subspine
+ )
+ )
+ (HistoryAssociation sym var)
+ (LinkExtender sym var) // Remaining link extender
+ [pvar] // Node-ids in rule to handle
+ -> ( HistoryAssociation sym var
+ , [HistoryPattern sym var] // History patterns with derived pattern prefixed
+ , LinkExtender sym var // Extended link extender
+ )
+ | == sym
+ & == var
+ & == pvar
+
+extendnodes sgraph rgraph matching sparent issub extendsub newpattern restextender rnodes
+ = foldr (extendnode sgraph rgraph matching issub extendsub) (newpattern,[],restextender) (zip2 links rnodes)
+ where links = [Yes (sparent,i)\\i<-[0..]]
+
+extendnode
+ :: (Graph sym var) // Subject graph
+ (Graph sym pvar) // Applied rewrite rule
+ (Pfun pvar var) // Partial match from rewrite rule's pattern to subject graph
+ (pvar -> Bool) // Tells if this is where the subspine was attached
+ ( (HistoryAssociation sym var)
+ (Link var) // Link passed to subspine handler
+ (LinkExtender sym var) // Link extender input to subspine handler
+ -> ( HistoryAssociation sym var
+ , HistoryPattern sym var // Pattern returned for subspine
+ , LinkExtender sym var // Link extender returned for subspine
+ )
+ )
+ ( Link var // Referring link to current node-id
+ , pvar // Current node-id in rule
+ )
+ ( HistoryAssociation sym var
+ , [HistoryPattern sym var] // History patterns to prefix derived patterns to
+ , (LinkExtender sym var) // Remaining link extender
+ )
+ -> ( HistoryAssociation sym var
+ , [HistoryPattern sym var] // History patterns with derived pattern prefixed
+ , (LinkExtender sym var) // Extended link extender
+ )
+ | == sym
+ & == var
+ & == pvar
+
+extendnode sgraph rgraph matching issub extendsub (link,rnode) (newpattern0,rest,extender0)
+ | issub rnode
+ = (subnewpattern,[subpattern:rest],subextender)
+ | rdef
+ = foldpfun mapped unmapped matching rnode
+ = unmapped
+ where (subnewpattern,subpattern,subextender)
+ = extendsub newpattern0 link extender0
+ mapped snode
+ = (newpattern1,[thispat:rest],extender2)
+ where extender2 = adjust link thispat extender1
+ thispat = Closed rsym argpatts
+ (newpattern1,argpatts,extender1) = extendnodes sgraph rgraph matching snode issub extendsub newpattern0 extender0 rargs
+ unmapped
+ = (newpattern0,[Extensible link:rest],extender0)
+ (rdef,(rsym,rargs)) = varcontents rgraph rnode
+
+
+/****************
+* Miscellaneous *
+****************/
+
+instance == (Optional a) | == a
+ where (==) No No = True
+ (==) (Yes x1) (Yes x2) = x1==x2
+ (==) _ _ = False
diff --git a/sucl/strat.dcl b/sucl/strat.dcl
index d65972d..01589e0 100644
--- a/sucl/strat.dcl
+++ b/sucl/strat.dcl
@@ -8,6 +8,7 @@ from rule import Rule
from graph import Graph,Node
from StdOverloaded import ==
+from history import HistoryAssociation,HistoryPattern,Link // for History
from spine import Spine // for Answer
from spine import Subspine // for Spine
from rule import Rgraph // for History
diff --git a/sucl/strat.icl b/sucl/strat.icl
index 8d1d469..0f938b8 100644
--- a/sucl/strat.icl
+++ b/sucl/strat.icl
@@ -124,11 +124,8 @@ makernfstrategy hist strat rnfnodes node graph
= strat` (substrat spinenodes`) graph subspinecont rnfanswer cnt
where (def,cnt) = dnc (const "in makernfstrategy") graph node
spinenodes` = [node:spinenodes]
-
subspinecont subspine = spinecont (node,subspine)
-
- strat` = checkinstance (graph,node) histpatts strat
- histpatts = foldr (foldmap (++) id hist) [] spinenodes`
+ strat` = checkhistory (graph,node) spinenodes hist strat
/*
@@ -174,14 +171,14 @@ matchrule matchable substrat subject found sargs rule fail
pattern = rulegraph rule
pairs = zip2 pargs sargs
matchable` = matchable pattern
- foundsub matching spine = found (Partial rule matching spine)
+ foundsub matching rnode spine = found (Partial rule matching rnode spine)
foundmatch matching = found (Redex rule matching)
matchnodes
:: (pvar var -> .Bool)
.(Graph sym var)
(Substrategy sym var pvar result)
- ((Pfun pvar var) (Spine sym var pvar) -> result)
+ ((Pfun pvar var) pvar (Spine sym var pvar) -> result)
result
.(Graph sym pvar)
-> ((Pfun pvar var) -> result)
@@ -200,8 +197,8 @@ matchnodes matchable subject substrat found fail pattern
| not pdef
= match (extend pnode snode matching)
| not sdef
- = found matching openspine
- = substrat (found matching) rnfanswer snode
+ = found matching pnode openspine
+ = substrat (found matching pnode) rnfanswer snode
where openspine = (snode,Open (mkrgraph pnode pattern))
rnfanswer
| psym==ssym && eqlen pargs sargs
@@ -331,9 +328,10 @@ forcenodes
-> .result
forcenodes substrat found rnf nodes
-= foldr forcenode rnf nodes
- where forcenode nid rnfrest = substrat foundforce rnfrest nid
- foundforce spine = found (Force spine)
+= foldr forcenode rnf (zip2 [0..] nodes)
+ where forcenode (argno,nid) rnfrest
+ = substrat foundforce rnfrest nid
+ where foundforce spine = found (Force argno spine)
/*
@@ -344,22 +342,21 @@ Check for an instance in the termination history.
*/
-checkinstance
- :: (.Graph sym var,var)
- [.Rgraph sym var]
- (Strategy sym var .pvar result)
- -> Strategy sym var .pvar result
+checkhistory
+ :: (Graph sym var,var)
+ [var]
+ (History sym var)
+ (Strategy sym var pvar result)
+ -> Strategy sym var pvar result
| == sym
& == var
- & == pvar
-checkinstance (graph,node) history defaultstrategy
-= foldr check defaultstrategy history
- where check hrgraph defaultstrategy substrat subject found rnf (ssym,sargs)
- | isinstance (hgraph,hroot) (graph,node)
- = found (Unsafe hrgraph)
- = defaultstrategy substrat subject found rnf (ssym,sargs)
- where hgraph = rgraphgraph hrgraph; hroot = rgraphroot hrgraph
+checkhistory (sgraph,snode) spinenodes history defaultstrategy
+ = if (isEmpty histpats) defaultstrategy unsafestrategy
+ where histpats
+ = matchhistory history spinenodes sgraph snode
+ unsafestrategy _ _ found _ _
+ = found (Unsafe (hd histpats))
// Check for curried applications
diff --git a/sucl/trace.dcl b/sucl/trace.dcl
index 5479b52..f8e884d 100644
--- a/sucl/trace.dcl
+++ b/sucl/trace.dcl
@@ -2,7 +2,7 @@ definition module trace
// $Id$
-from history import History
+from history import History,HistoryAssociation,HistoryPattern
from spine import Answer
from rule import Rule
from spine import Spine,Subspine // for Answer