aboutsummaryrefslogtreecommitdiff
path: root/sucl/strat.dcl
diff options
context:
space:
mode:
Diffstat (limited to 'sucl/strat.dcl')
-rw-r--r--sucl/strat.dcl166
1 files changed, 166 insertions, 0 deletions
diff --git a/sucl/strat.dcl b/sucl/strat.dcl
new file mode 100644
index 0000000..6a0dd6b
--- /dev/null
+++ b/sucl/strat.dcl
@@ -0,0 +1,166 @@
+definition module strat
+
+from history import History
+from spine import Answer
+from rule import Rule
+from graph import Graph,Node
+from StdOverloaded import ==
+
+from spine import Spine // for Answer
+from spine import Subspine // for Spine
+from rule import Rgraph // for History
+from basic import Optional // for Spine
+
+:: Strategy sym var pvar result
+ :== (Substrategy sym var pvar result)
+ (Graph sym var)
+ ((Subspine sym var pvar) -> result)
+ result
+ (Node sym var)
+ -> result
+
+:: Substrategy sym var pvar result
+ :== ((Spine sym var pvar) -> result)
+ result
+ var
+ -> result
+
+:: Law sym var pvar result
+ :== (Substrategy sym var pvar result)
+ (Graph sym var)
+ ((Subspine sym var pvar) -> result)
+ result
+ [var]
+ result
+ -> result
+
+// Apply a strategy recursively to a graph
+// by deriving the substrategy from it and feeding it back to it
+// Think Y operator
+makernfstrategy
+ :: .(History sym var) // History of previous rooted graphs attached to nodes
+ (Strategy sym var pvar (Answer sym var pvar)) // Strategy for a defined node
+ .[var] // List of nodes known in RNF (closed pattern nodes of subject rule+strict args)
+ var // Root of replacement
+ .(Graph sym var) // Subject graph
+ -> Answer sym var pvar
+ | == sym
+ & == var
+ & == pvar
+
+
+/* ------------------------------------------------------------------------
+STRATEGY TRANSFORMERS
+The funcions below tranform (simpler) strategies into more complicated ones
+------------------------------------------------------------------------ */
+
+// A strategy transformer that checks for constructor applications
+checkconstr
+ :: (sym->.Bool)
+ (Strategy sym .var .pvar .result)
+ (Substrategy sym .var .pvar .result)
+ (Graph sym .var)
+ ((Subspine sym .var .pvar) -> .result)
+ .result
+ (Node sym .var)
+ -> .result
+
+// A strategy transformer that checks for primitive symbol applications
+checkimport
+ :: !(sym->.Bool)
+ (Strategy sym .var .pvar .result)
+ (Substrategy sym .var .pvar .result)
+ (Graph sym .var)
+ ((Subspine sym .var .pvar) -> .result)
+ .result
+ (Node sym .var)
+ -> .result
+
+// A strategy transformer that checks (hard coded) laws
+checklaws
+ :: [(sym,Law sym var pvar result)]
+ (Strategy sym var pvar result)
+ (Substrategy sym var pvar result)
+ (Graph sym var)
+ ((Subspine sym var pvar) -> result)
+ result
+ (Node sym var)
+ -> result
+ | == sym
+
+// A strategy transformere that checks a list of rewrite rules
+// This is the real thing that characterises the functional strategy
+checkrules
+ :: ((Graph sym pvar) pvar var -> .Bool)
+ (sym -> [.Rule sym pvar])
+ (Strategy sym var pvar result)
+ (Substrategy sym var pvar result)
+ (Graph sym var)
+ ((Subspine sym var pvar) -> result)
+ result
+ (Node sym var)
+ -> result
+ | == sym
+ & == var
+ & == pvar
+
+// A strategy transformer that checks a type rule
+// for curried applications and strict arguments
+checktype
+ :: !(sym -> (Rule .tsym tvar,[.Bool]))
+ (Strategy sym var .pvar .result)
+ (Substrategy sym var .pvar .result)
+ .(Graph sym var)
+ ((Subspine sym var .pvar) -> .result)
+ .result
+ !.(Node sym var)
+ -> .result
+
+/* ------------------------------------------------------------------------
+USEFUL AIDS FOR DEFINING STRATEGY TRANSFORMERS
+The functions below are useful for inspecting a graph
+such as done by a strategy transformer.
+------------------------------------------------------------------------ */
+
+// Force evaluation of stricts arguments of a node in the graph
+forcenodes
+ :: (Substrategy .sym .var .pvar .result)
+ ((Subspine .sym .var .pvar) -> .result)
+ .result
+ ![.var]
+ -> .result
+
+// Try to apply a transformation rule (that doesn't need evaluated arguments)
+rulelaw
+ :: .(Rule sym pvar)
+ -> Law sym var pvar result
+ | == sym
+ & == var
+ & == pvar
+
+// Try to apply a law
+trylaw
+ :: .(Graph sym var)
+ (.(Subspine sym var pvar) -> result)
+ .[var]
+ .(Rule sym pvar)
+ result
+ -> result
+ | == sym
+ & == var
+ & == pvar
+
+// Try a list of rewrite rules
+// Requires argument evaluation for closed patterns
+tryrules
+ :: ((Graph sym pvar) pvar var -> .Bool)
+ (Substrategy sym var pvar result)
+ .(Graph sym var)
+ ((Subspine sym var pvar) -> result)
+ .[var]
+ -> result
+ [.Rule sym pvar]
+ -> result
+ | == sym
+ & == var
+ & == pvar