blob: c2b6ce6b31445aa6b4f5e1c99077bf2273a91cbd (
plain) (
tree)
|
|
definition module strat
// $Id$
from spine import Answer
from history import History
from rule import Rule
from graph import Graph,Node
from StdOverloaded import ==
from StdClass import Eq
from cleanversion import String
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
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
| Eq sym
& Eq var
& Eq pvar
/* ------------------------------------------------------------------------
STRATEGY TRANSFORMERS
The funcions below tranform (simpler) strategies into more complicated ones
------------------------------------------------------------------------ */
// A strategy transformer that checks for partial applications
checkarity
:: !(sym -> Int) // Arity of function symbol
(Strategy sym var pvar .result) // Default strategy
(Substrategy sym var pvar .result) // Substrategy
(Graph sym var) // Subject graph
((Subspine sym var pvar) -> .result) // Spine continuation
.result // RNF continuation
!.(Node sym var) // Subject node
-> .result
// A strategy transformer that checks for constructor applications
checkconstr
:: (sym->String)
(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 function application
// for strict arguments
checkstricts
:: !(sym -> [.Bool]) // Strict arguments of function
(Strategy sym var pvar .result) // Default strategy
(Substrategy sym var pvar .result) // Substrategy
(Graph sym var) // Subject graph
((Subspine sym var pvar) -> .result) // Spine continuation
.result // RNF continuation
!.(Node sym var) // Subject node
-> .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
|