# Walid 23 / 06 / 2022
Suppression de VarOf
Delta(t) = évalue les fonctions à évaluation retardée de t
evalExpr : accès aux champs + GlobalVar
t' : [l->r] (t) = evalExpr(Delta(evalExpr(sigma(replaceGlobalVarNonFail(r)))) where sigma= Matching(evalExpr(Delta(evalExpr(l))),t) % pas d'évaluation de t
evalExprl) : si GlobalVar contient variable de réécriture
s : s1; (g(x_)->r);
s : s1; ruleDelayEval("",g,[arg g],"g",f,[arg f],"f")
t : 1+GlobalVar("toto")
z : applyToExpr(s,t)
evalExpr(blockEval(delayEval(f,u)) :
storeExpr("toto", f(x_,y_)) ; (g(x_,y_) --> GlobalVar("toto") + blockEval(GlobalVar(x_)))
StoreExpr(GlobalVar("toto"), f(x_,y_)) ; evalExpr(GlobalVar("toto")) applied to g(a,b)
# Rajouter une stratégie
## 1ère méthode: par ajout d'un constructeur
Etapes pour créer un nouveau constructeur, e.g. `NewConstructor`, dans le type ocaml `strategy` (qui permet de faire des combinaisons de stratégies sans modification du parseur):
1. ajouter le constructeur `newConstructor` dans types.ml
2. modifier les fonctions d`affichage et conversions de ce type vers le bas niveau` voir le manuel. L'affichage est utilisé pour l'affichage des stratégies dans les extenions. Et la conversion est utilisée dans l'application des extensions aux strategies.
3. ecrire la fonction ocaml `newConstructor` qui implemente la sémantique de la nouvelle strategie
4. modifier la fonction `convert_strategy_to_function` en associant `NewConstructor` à newConstructor
5. pour ne pas modifier le parseur, il suffit de créer une fonction `funConstructorNewConstructor` qui sera igonrée par le parseur, mais Ocaml va la remplacer par NewConstructor. Cette fonction sera appelée dans le language utilisateur et combinée à d'autre strategies*)
`let funConstructorNewConstructor t = NewConstructor t ;;` (* ajout d`un constructeur (augmenter la grammaire), le parseur va interpréter f comme ce construteur *)
## 2ième méthode: par fonctions à évaluation retardées
(* On veut ajouter une fonction newStrategy
1. definir cette fonction newStrategy dans Ocaml
2. créer une règle réecriture identité ruleDelayEval(x_,newStrategy,[x_],"label")
*)
let cond' = apply_subst sigma cond in
if eval_condition(check_if_postMatchingSearch cond cond')
(*===========================================================================*)
(*-------------------------------- topDown ----------------------------------*)
(*===========================================================================*)
let rec topDown` strat t = fail_as_identity(composition [fail_as_identity(strat) ;
most_childs (fail_as_identity(topDown` strat))]) t
;;
(* itération jusqu`à un point fixe, si échec retourne le dernier résultat de l`itération*)
let rec topDown strat t = composition [safe_iterate(strat) ; most_childs (fail_as_identity(topDown strat))] t
(* most_childs = descente dans tous les fils et échoue si toutes les applications échouent, si certains fils échouent se comporte comme l`identité; fail_as_identity : ne sert peut-être à rien; *)
;;
(*===========================================================================*)
(*-------------------------------- outerMost -------------------------------*)
(*===========================================================================*)
(* Matching_Error : utilisé pour le filtrage et pour toutes les stratégies pour une raison de compositionalité *)
let rec outerMost strat t =
begin match t with
| Var(_,_)
| Terme(_,[]) ->
begin
try strat t
with Matching_Error(msg,exp1,exp2) -> t (*Matching_Error : utilisé quand strat ne s`applique ne s`applique pas - valable pour toutes les stratégies*)
end
| _ -> try strat t
with Matching_Error(msg,exp1,exp2) -> most_childs (outerMost strat) t
end;;
(* essai d`une nouvelle version de outerMost qui n`échoue pas - devrait être équivalente à la précédente *)
(*let rec outerMost strat t = if (is_leaf t) then (fail_as_identity(strat t))
else leftChoice [strat ; most_childs (outerMost strat)] t
;;
*)
(* version de outermost qui échoue *)
(*let rec outerMost strat t = if (is_leaf t) then (strat t)
else leftChoice [strat ; most_childs (outerMost strat)] t
;;
*)
(*===========================================================================*)
(*-------------------------------- bottomUp --------------------------------*)
(*===========================================================================*)
let rec bottomUp strat t = composition [most_childs (fail_as_identity(bottomUp strat)) ;
fail_as_identity strat] t ;;
(*===========================================================================*)
(*-------------------------------- innerMost -------------------------------*)
(*===========================================================================*)
let rec innerMost strat t = leftChoice [most_childs (innerMost strat) ; strat] t ;;
# Documentation Symbtrans
## Ce que fait symbtrans
- différence avec d`autres logiciels: Tom, mathematica, maple
- interaction symbtrans-parseur?
## Representation des types
- Définition
- Haut niveau
- tree, strategy, extension
- condition dans tree
- Bas niveau
- terme, extension_oc
- Structures
- liste d`association
- globalVar
- Conversions entre types
- applatissement des listes
- schéma
- conditions
- Conversion entre types symbtrans et types ocaml
- stratégies -> fonctions
- condition -> booléen
- extensions -> fonctions
- chaines de caractère
- Quoi faire pour modifier quelque chose?
- Interaction avec le parseur
- Interaction avec htmlview
- Affichage
## Algorithmes
- Filtrage modulo associativité
- Application de règles
- fonctions dans le terme droit
- evaluation des globalVar
- Application de stratégies
- Application d`extensions
- diffDebug
- htmlView
- Affichage (les principes notamment pour modifier)
- Synthèse d`extensions
- Combinaision d`extensions
## Tests
- Expliquer les tests
## Améliorations
### Comment restructurer les objets bas niveau et haut niveau de michel
### Optimisation
### Tests supplémentaires