aboutsummaryrefslogblamecommitdiff
path: root/sucl/strat.dcl
blob: c2b6ce6b31445aa6b4f5e1c99077bf2273a91cbd (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
       
                        
                           

                            
                       
                               
 
                                                                         


































                                                                                                                                  
                                                                 
                       

           





                                                                           

                                                                     


                                                              


                                                             
                                                                  
                 


                                        
           
                   



                                                                       


                                        
           
                   
















                                                                    
                             









                                       


                                                                         


                                                              
                                                             








                                                                           
                                        
           
           


                                                                             
                   





                           
                   
                                        
                   









                                                   
                   

                                       
                    


           
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