URL: https://linuxfr.org/users/montaigne/journaux/des-paradigmes-alternatifs Title: Des paradigmes alternatifs Authors: Ontologia Date: 2011年05月25日T00:38:57+02:00 License: CC By-SA Tags: agentspeakl et programmation Score: 48 On connait tous les paradigmes de programmation les plus populaires (objet, impératifs, fonctionnels, logiques), mais la créativité n'est heureusement pas limité et il en existe d'autre très intéressants. Voici une petite liste non exhaustive de quelques paradigmes curieux, mais assez stimulants pour tout créateur de langage un peu fou. La plus connue est sans doute la programmation événementielle, elle a sa page wikipedia en français [[programmation événementielle]]. Elle consiste à baser le flot du programme sur des évènement en y associant des bouts de code et en récupérant de ces évènements des informations. Le système de signal/slot de QT est une application intéressante de ce principe, en ce qu'elle permet de "connecter" directement des évènements à des valeurs quelques part dans le programme, ou plus prosaïquement à des bouts de code. Les langages classique implémentent plus ou moins heureusement ce genre de paradigme. Les langages ayant des des types block ou des lambda, le gèrent plus facilement, les autres utilisent des grosses bidouilles ou des préprocesseurs, comme QT. Le gros défaut de ce paradigme c'est qu'il reste un hack qui rentre en pleine collision avec le paradigme de programmation impératif/fonctionnel/objet qui descend directement de la logique de batch des ordinateurs des années 50. ##Rule Based Programming## La programmation orienté règle (Rule Based Programming) est peu connue et assez intéressante. Elle se rapproche plus d'une logique du premier ordre, donc assez haut niveau. Il n'y a pas grand chose de très différent avec un moteur à la Prolog. Seul le contrôle de flot diffère puisque le moteur va "surveiller" la base de fait pour appliquer une règle qui pourrait "matcher"  Elle est à la base de Drools, qui est un moteur d'inférence libre pour le monde Java, distribué par Apache ##Les langages orientés agent "BDI"## Alors là c'est vraiment intéressant et vraiment exotique. Basés sur la théorie de Michael Bratman du "human practical reasoning", les langages Belief, Desire, Intention modélisent l'agent comme une entité ayant des objectifs finaux (Desire), des croyances issus de son passé ou de ses perceptions et des intentions immédiates lui permettant d'atteindre ses objectifs.  Les langages BDI font l'objet de pas mal de recherches dans les laboratoires car ils sous-tendent tout un ensemble de problèmes théoriques. La formalisation de ce genre d'approche a été en effet l'occasion de développer différents modèles de _logique modale_. Les logiques modales, à la différence de la logique classique permettent d'exprimer des concepts un peu plus fin que "il est vrai que Jean habite à Paris". Elles permettent par exemple d'exprimer qu'"il est possible que Jean habite à Paris" (logique aristotélicienne), qu'"il est connu que Jean habite à Paris" (logique épistémique), "il est obligatoire que Jean habite Paris" (logique déontique) ou encore qu'"il est permis que Jean habite à Paris". N'oublions pas la logique temporelle qui permet d'exprimer la variabilité d'une vérité en fonction du temps. S'ensuivent toute sorte de problèmes lorsque l'on veut faire de la logique multi-modale, qui supposent pas mal de difficultés en terme de complexité (ça peut être gérable), voire de complétude (c'est plus gênant). Pour illustrer à quoi ressemble ce genre de langage, je vous propose de regarder l'implémentation du jeu de la vie. La cellule est ici un agent, et elle a une perception alive_neighbors qui lui permet d'ajouter des croyances au fur à mesure des "tours". Ce bout de code est issu de Jason (http://jason.sourceforge.net/Jason/Jason.html) , qui est un excellent environnement de développement orienté BDI. Tout est là pour vous faciliter la vie : débuggeur, outils graphique, exemples, etc... http://jason.sourceforge.net/mini-tutorial/getting-started/ Cela se lit de la manière suivante : Si un nouvelle perception/croyance step(_) **et que** alive_neighbors(2) alors exécute skip. Si on avait écrit !skip, cela signifierai que skip est un nouveau but (Desire) de l'agent, ce qui ne voudrait rien dire dans notre cas. ```prolog // If there are 2 alive neighbors, the cell remains in the state it is in. +step(_) : alive_neighbors(2) <- skip. // If there are exactly three alive neighbors, the cell becomes alive. +step(_) : alive_neighbors(3) <- live. // If there are less than two alive neighbors, then the cell dies. // If there are more than three alive neighbors, the cell dies. +step(_) <- die. ``` Bref, tout cela pour dire que l'on va un peu plus loin que nos automates de Turing améliorés qui nous servent de langages de programmations quotidiens. Pour ma part, je crois que les langage agent BDI ont un grand avenir devant eux, mais cela mettra quelques décennies à s'imposer.