Résumé

Le projet nomoSeed propose un nouveau langage de programmation pour concevoir des systèmes réactifs : le langage nomo.

Le langage nomo pourrait être qualifié de déclaratif, réactif, adaptif, concurrent, synchrone, typé et interprété.

Aspect technique

Un système réactif se comprend ici comme un système réagissant en fonction de l’arrivée d’évènements.

Le langage nomo permet de définir une base de règles décrivant la manière de réagir en fonction des évènements et de leurs dispositions dans le temps.

La base de règles est chargée dans un interpréteur qui pourra recevoir des évènements externes et réagira s’il y a lieu en produisant des évènements internes ou en envoyant des messages vers le système qui l’englobe.

Les règles et les évènements sont regroupés par catégorie puis regroupés par type. Les catégories sont définies par le langage, les types par le programmeur.

Une horloge externe cadence l’interpréteur, à chaque coup d’horloge, les règles sont évaluées et les évènements mis à jour. Concernant les évènements externes de même type, seul le dernier depuis le coup d’horloge précédant sera considéré comme un événement associé à la valeur de l’horloge.

En fonction des évènements, à chaque coup d'horloge, au plus une règle par type sera sélectionnée et appliquée.

L’application d’une règle conduit à la production pondérée d’un évènement interne de type idoine.

Les évènements externes correspondent à des tableaux de flottants et les évènements internes correspondent à un triplet : une information (un label), un indice temporel (durée depuis l’arrivé de l’évènement) et la crédibilité (reflétant l’adéquation entre les faits et la règle au moment de la sélection). Un évènement interne représentant une commande est associé à un tableau de flottants qui sera envoyé au système englobant l’interpréteur.

Les évènements s’écoulent au sein d’une mémoire évènementielle jusqu'à un seuil d’oubli.

Un point intéressant est que certaines catégories de règles peuvent produire des évènements à retard qualifié d'intentions. Contrairement aux autres évènements, qualifiés d'évidences, ces évènements retardés peuvent être annulés avant qu’ils deviennent des évidences par un évènement moins retardé de même type. Cette propriété autorise la modélisation de la notion d’état.

L’évaluation de l’adéquation entre les règles et les évènements s’appuie sur le fait que les prémisses correspondent à des noyaux gaussiens. Ceux-ci pourront être optimisés en fonction des données conduisant à la sélection de la règle.

Une dynamique d’évaluation de la pertinence des règles est également proposée en natif. Cette dynamique s’inspire de celle des Learning Classifier System de Holland (1980). Cette mécanique permet d’oublier les règles non usitées ou redondantes.

Une autre originalité du langage nomo consiste à pouvoir définir des règles décrivant la manière de créer de nouvelles règles au cours du fonctionnement de l’interpréteur. Cette capacité a permis d’avancer une « dynamique d’autocréation » ou « autopoièse sémiotique » dont le principe consiste à ce que des règles, par imitation de leur propre activité, conduisent à la production de règles qui permettront de perpétuer cette même dynamique afin de contre balancer un mécanisme d’oubli qui élimine les règles.

L'ensemble de ces caractéristiques autorise la mise en œuvre d’un mécanisme d'auto-organisation tout en conservant de fortes propriétés logiques, et de modéliser des logiques temporelles, des logiques floues ou des logiques révisables.

Le langage nomo introduit également des mécanismes de prédiction, d’évaluation de ces prédictions, de renforcement et d’inhibition. Tous ces mécanismes contribuent à offrir une large palette pour la conception d’algorithmes d’apprentissage, par exemple, des stratégies de classification de type supervisé, semi-supervisé ou non supervisé et ce de manière ascendante (avec création de règles) et/ou descendante (élimination des règles redondantes ou inutilisées).

Aspect pratique

Tout ce qui précède, se veut davantage une présentation sur les principes du langage nomo que le langage lui-même. En effet, la syntaxe du langage nomo est une syntaxe XML et un projet nomo, appelé unité, regroupe différents documents XML : les modèles qui définissent les types et leur ensemble de définition, les programmes qui regroupe règles, les paramètres liés au dimensionnement de la base de connaissance et les paramètres liés à la dynamique ; sans parler des notions liées à l’organisation en programme et sous-programme avec les modèles.

Un projet nomo une fois transformé en pseudo-code est chargé dans l'interpréteur appelé nomoInterpreter. Ce dernier prend la forme d’une bibliothèque dynamique développée en Ada pouvant s'interfacer aisément en Ada, C, Java et Python. Lors de l’initialisation de l’interpréteur, il lui sera transmis un tableau des pointeurs de fonction d’appel représentant chacun un type commande.

Une fois initialisé, le programmeur envoie des évènements à l’interpréteur via des appels de fonction avec, en paramètre, un entier (représentant le type d’évènement) et un tableau de flottants (représentant les valeurs de l’évènement). Parallèlement, il cadence, par un appel de fonction, l’interpréteur à une fréquence préalablement définie. Un mécanisme de journalisation est également disponible.

Un environnement de développement nomoSDK, écrit en C++/Qt, met à disposition un analyseur syntaxique et grammatical, des facilités d'écritures via des macros, des formalismes ou patrons de conception prédéfinis, deux environnement de simulation, ainsi qu'un outil de visualisation de la journalisation issue de l'interpréteur.

En ligne de commande, il est possible d'utiliser nomoTools pour évaluer le temps de calcul maximal d'une interprétation pour une base de règles donnée.

La documentation et les tutoriels sont librement accessibles sur le site. L'interpréteur nomoInterpreter est placé sous licence AGPLv3. L'environnement de développement nomoSDK sous licence GPLv3. Ces logiciels sont librement téléchargeables.