Pour appliquer une règle, il suffit de remplacer la partie de la liste qui constitue la partie droite de la règle
par la partie gauche de la règle. Il faut ensuite exécuter les actions sémantiques de la partie droite.
Pour appliquer une règle sur la globalité de la liste des symbôles, on utilise le prédicat apply_rule_globally
.
apply_rule_globally(RULE, SYMBOLS, NEW_SYMBOLS):- apply_rule(RULE, SYMBOLS, NEW_SYMBOLS). apply_rule_globally(RULE, [SYMBOL|SYMBOLS], [SYMBOL|NEW_SYMBOLS]):- apply_rule_globally(RULE, SYMBOLS, NEW_SYMBOLS). apply_rule((HEAD := BODY), SYMBOLS, NEW_SYMBOLS):- remove_symbols(BODY, SYMBOLS, REST), append_symbols(HEAD, REST, NEW_SYMBOLS), apply_semantics(HEAD := BODY).
Pour supprimer les symbôles de la fin de la liste, on parcours cette liste en supprimant d'abord le dernier symbôle de la partie droite et en ignorant les actions sémantiques.
remove_symbols((SYMBOL,SYMBOLS), LIST, REST):- !, remove_symbols(SYMBOLS, LIST, [SYMBOL|REST]). remove_symbols({_},LIST,LIST):-!. % actions sémantiques remove_symbols(SYMBOL, [SYMBOL|SYMBOLS], SYMBOLS). % pour le dernier
Sur le même principe, on reconstruit la liste en rajoutant les symbôles de la partie gauche à la liste des symbôles restants.
append_symbols([],LIST,LIST):- !. append_symbols((SYMBOL,SYMBOLS), LIST, REST):- !, append_symbols(SYMBOLS,[SYMBOL|LIST],REST). append_symbols(SYMBOL, LIST, [SYMBOL|LIST]).
Il ne reste plus qu'à appliquer les actions sémantiques. Pour cela on parcours le corps de la règle et on exécute toutes les actions rencontrées de gauche à droite.
apply_semantics(HEAD := (ITEM, BODY)):- !, apply_semantics(HEAD := ITEM), apply_semantics(HEAD := BODY). apply_semantics(HEAD := {SEMANTIC,SEMANTICS}):- !, SEMANTIC, apply_semantics(HEAD := {SEMANTICS}). apply_semantics(_ := {SEMANTIC}):- !, SEMANTIC. apply_semantics(_ := _).