Le contexte
Le contexte est l'ensemble des informations testées dans les règles. Les informations sur le joueur telles que la quantité d'or possédée, les informations sur les autres joueurs telles que le score ou bien les informations sur le jeu telles que la durée de la partie ou les conditions de victoire sont quelques exemples. Ces informations véhiculent des valeurs et ce sont ces valeurs qui peuvent être testées dans une règle. Il existe quatre types d'information :
Les informations véhiculant la valeur VRAI ou la valeur FAUX.
Les informations véhiculant une valeur numérique.
Les informations véhiculant une valeur comprise dans un ensemble de valeurs définies par le système. (ces ensembles sont décrits dans la section paramètre).
Les informations véhiculant une valeur numérique et nécessitant l'utilisation d'un paramètre pour être clairement définie.
Utilisation du contexte :
Les informations sont utilisées pour activer les règles. Un
test d'un contexte est utilisé pour savoir si une condition est vérifiée. La
réponse à un test de contexte ne peut être que VRAI (True) ou FAUX (False).L'exemple
suivant montre comment provoquer l'entraînement d'un villageois lorsqu'on
possède au moins 50 unités de nourriture :
(defrule
(food-amount greater-than 50)
=>
(train villager)
)
Tester le contexte :
Pour les informations VRAI ou FAUX, la condition d'une règle est vérifiée en contrôlant uniquement la valeur de l'information. Exemple:
(defrule
(regicide-game)
=>
(chat-to-all "A mort le roi !")
)
Dans le cas des informations numériques, vous verrez <rel-op> associé à ces informations, c'est un opérateur relatif qui vous permet de tester la relation d'une information avec une valeur. Par exemple, si vous souhaitez activer une règle lorsqu'une certaine quantité de bois est collectée, vous pouvez écrire :
(defrule
(wood-amount greater-than 1000)
=>
(chat-to-all "J'ai plus de 1000 unités de bois !")
)
Dans notre exemple, wood-amount (quantité de bois) est une information
numérique de contexte, greater-than (plus grand que) est un opérateur
relatif et 1000 est la valeur de comparaison. La règle peut être traduite en
algorithmique par : Si la quantité de bois en ma possession est strictement
supérieure à 1000 unités alors envoyer à tout le monde le message
"J'ai plus de 1000 unités de bois !".
Les opérateurs relatifs existants sont les suivants :
# less-than (strictement inférieur à, raccourci : <)
# less-or-equal (inférieur ou égal à, raccourci : <=)
# greater-than (strictement supérieur à, raccourci : >)
# greater-or-equal (supérieur ou égal à, raccourci : >=, attention ne
pas confondre avec => désignant une liste d'actions dans une règle)
# equal (égal à, raccourci : ==, attention ce sont deux symboles = contigus)
# not-equal (différent de, raccourci : !=)
Pour les informations véhiculant une valeur prédéfinie, la condition d'une règle est vérifiée en contrôlant la valeur de l'information par rapport à un paramètre. Exemple :
(defrule
(civ-selected viking)
=>
(chat-to-all "Vous allez voir ce que nous autres les vikings sommes
capables de vous infliger !!!")
)
Dans cet exemple, viking est une valeur prédéfinie du paramètre <civ>
(civilisation).
Les informations numériques complexes nécessite l'utilisation des opérateurs relatifs et de certains paramètres pour vérifier une condition. Si par exemple vous souhaitez évaluer la quantité d'or que vous avez mis en réserve :
(defrule
(escrow-amount gold > 10000)
=>
(chat-to-all "Je suis extrêmement riche.")
)
Dans cet exemple, escrow amount (quantité mise en réserve) doit connaître
le type de ressources que l'on souhaite tester pour renvoyer une valeur, le
type de ressource <resource-type> est ici l'or (gold).