Création d’une règle de production
symbole pour représenter la syntaxe {} : éléments optionnel | : ou espace : sépare les éléments d’une séquence [ ] : bloc de syntaxe * : zéro répétition ou plus + : une répétition ou plus 2
syntaxe d’une règle 3
buffer-test : condition dans une règle 4
query : condition dans une règle 5 [ buffer-test | query | eval | binding | multiple-value-binding ] query ?buffer-name> [requête-nom requête-valeur]* requête-nom chaque module comprend un nombre déterminé de requête voir prochaine diapositive requête-valeur pour requête et module, il y a plusieurs valeurs possibles ayant une sémantique propre au module voir prochaine diapositive (P nnn ?goal> state free buffer full - state error …)
query : condition dans une règle 6 [ buffer-test | query | eval | binding | multiple-value-binding ] Les requêtes comprises par tous les tampons ou modules buffer empty buffer full buffer requested le chunk a été mis par le module buffer unrequested le chunk n’a pas été mis par le module state free state busy en train de traiter une requête state error vrai si la présente requête a échouée error t == state error error nil == - state error
conditions arbitraires d’une règle 7 [ buffer-test | query | eval | binding | multiple-value-binding ] eval ::= !eval! form form devient une condition arbitraire condition est fausse, si (eval form) == nil binding ::= !bind! variable form form devient une condition arbitraire condition est fausse, si (eval form) == nil si condition est vraie variable == (eval form) multiple-value-binding ::= !mv-bind! (variable+) form identique à binding, voir values en lisp attention un !bind! peut être réalisé avant qu’un buffer-test soit fait (P nnn !eval! (check-value =value) !bind! =max-value (+ =value 100) !mv-bind! (=quotient =remainder) (floor =max-value) … …)
modification d’un tampon : action d’une règle 8 [buffer-modification | request | buffer-clearing | modification-request | buffer- overwrite | eval | binding | multiple-value-binding | output | !stop!] buffer-modification =buffer-name> [slot-name new-value]* l’attribut slot-name prend la valeur new-value new-value ::= variable ou une valeur lisp attention “on ne peut plus mettre une expression lisp” C’est une bonne pratique de s’assurer dans la partie condition que le tampon est disponible (P nnn … =goal> state next-step slot1 =value )
requête : action d’une règle 9 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] requête +buffer-name> [variable | symboleLisp | isa chunk-type requête*] variable est tout identificateur commençant par = incluant le nom des buffer comme =goal requête ::= {= | - | | =} [slot-name | objet-requête] slot-value une demande au module de faire une action (P nnn … +retrieval> isa visual-location :recently-retrieved nil )
buffer-clearing : action d’une règle 10 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] vider le tampon -buffer-name> vide le tampon et le chunk est ajouté à la mémoire déclarative (P nnn … -imaginal> )
modification-request : action d’une règle 11 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] vider le tampon +buffer-name> [slot name slot-value]* demande au module correspondant au buffer-name une action (P nnn … -imaginal> )
requête : action d’une règle 12 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] vider le tampon +buffer-name> [slot name slot-value]* demande au module correspondant au buffer-name une action (P nnn … -imaginal> )
requête : action d’une règle 13 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] vider le tampon +buffer-name> [slot name slot-value]* demande au module correspondant au buffer-name une action (P nnn … -imaginal> )
requête : action d’une règle 14 [ buffer-modification | request | buffer-clearing | modification-request | buffer-overwrite | eval | binding | multiple-value-binding | output | !stop!] vider le tampon +buffer-name> [slot name slot-value]* demande au module correspondant au buffer-name une action (P nnn … -imaginal> )
ordre de réalisation des actions d’une règle 15 [buffer-modification | request | buffer-clearing | modification-request | buffer- overwrite | eval | binding | multiple-value-binding | output | !stop!] L’événements « exécution d’une règle » consiste à envoyer les actions aux gestionnaires d’événements, si ces actions sont simultanément réalisables alors ils sont réalisés avec les priorités suivantes : !eval! !output! et !bind” [priority :max] mod-buffer actions [priority 100] buffer overwrite actions [priority 90] module requests and module modification requests [priority 50] buffer clearings [priority 10] !stop! action generates a break event [priority :min]