Micro Systèmes n°49 janvier 1985
Micro Systèmes n°49 janvier 1985
  • Prix facial : 24 F

  • Parution : n°49 de janvier 1985

  • Périodicité : mensuel

  • Editeur : Société Parisienne d'Edition

  • Format : (203 x 271) mm

  • Nombre de pages : 198

  • Taille du fichier PDF : 137 Mo

  • Dans ce numéro : dossier sur l'ordinateur biologique.

  • Prix de vente (PDF) : gratuit

Dans ce numéro...
< Pages précédentes
Pages : 126 - 127  |  Aller à la page   OK
Pages suivantes >
126 127
LISP  : LANGAGE DE rINTELLIGENCE ARTIFICIELLE(II) FONCTIONS ET MACROFONCTIONS 2 TECHNIQUES DE PROGRAMMATION 126 — MICRO-SYSTEMES Ouvert et extensible, Lisp est un langage de programmation des plus performants. Depuis sa création, en 1960, il n'a cessé d'être amélioré et augmenté de nouvelles capacités, de nouveaux « features », comme disent les Anglo-Saxons. Toutes ces extensions (qui, pour certaines, furent introduites très tôt) n'ont qu'un seul but  : offrir au programmeur la possibilité de créer plus aisément ses logiciels afin d'augmenter son niveau de créativité. Dans ce second volet consacré à l'étude du langage Lisp, nous examinerons les relations que ce langage établit avec son interprète, et étudierons plus attentivement deux de ses constructions, les fonctionnelles et les macros, significatives du caractère unique de ce langage. L'interpréteur au bout des doigts L'une des grandes particularités du langage Lisp est de ne pas faire de distinction fondamentale entre code exécutable et données  : les expressions Lisp sont des listes, et donc manipulables comme des données. A vrai dire, cette caractéristique n'a rien de révolutionnaire. La structure même des ordinateurs supprime toute distinction entre programme et données  : ces deux constituants sont codés en langage binaire, et il est impossible, en regardant le contenu de la mémoire, de dire s'il s'agit de code ou de données. Les informaticiens qui travaillent en assembleur utilisent souvent cette propriété pour optimiser leurs programmes. Pourtant, la plupart des langages de programmation dits « évolués » (Fortran, Pascal, Basic, Ada, etc.) imposent une coupure radicale entre ce qui est information manipulée d'une part, et code manipulant d'autre part. En Intelligence Artificielle, il n'est pas toujours possible de séparer aussi nettement le raisonnement de l'information  : la connaissance est à la fois déclarative et procédurale, exprimant en un tout indifférencié les relations établies entre divers concepts d'une part, et les moyens qui permettent d'accomplir une tâche d'autre part. En autorisant l'exécution des données et la manipulation des fonctions par programmes, Lisp fournit une base de travail privilégiée au concepteur de systèmes « intelligents ». Sa puissance est due en grande partie aux deux primitives EVAL et APPLY, qui forment la base de cette programmation par les données, si caractéristiques de ce langage, et sans lesquelles nombre de (de testfonction (whilet (print " Valeurs pour " f) (print " Resultat  : " (apply f (read))))) ? (testfonction 1+) Valeurs pour + ? (2 3) Resultat  : 5 Valeurs pour + ? (8 9) Resultat  : 17 ? (testfonction'append) Valeurs pour append ? ((a c d)(e r t)) Resultat  : (a c de r Valeurs pour append ? (() (t y u)) Resultat  : (t y u) Hg. I. - La fonction TESTFONCTION applique indéfiniment des valeurs à la fonction F passée en argument. programmes d'Intelligence Artificielle n'auraient pas vu le jour. EVAL est une fonction qui prend une liste comme argument, et retourne le résultat de son évaluation. Par exemple, si l'on place une expression arithmétique dans une variable, ? (setq a'(+ 2 3)) = (+ 2 3) celle-ci peut être manipulée comme une donnée : ? (car'a) ? (cadra) =2 Mais elle peut aussi être évaluée : ? (eval a) =5 Il en est ainsi de n'importe quelle expression du langage. Par exemple, des formules comprenant des instructions de contrôles peuvent être construites puis évaluées : ? (eval (cons'if'((> 3 2)'oui'non))) = OUI La primitive APPLY est un peu plus difficile à comprendre au premier abord. Si EVAL Janvier 1985
permet d'évaluer une liste comme s'il s'agissait de code exécutable, APPLY, quant à elle, sert à appliquer une fonction sur une liste d'arguments. ? (apply'+'(2 3)) = 5 La figure 1 montre un exemple d'utilisation de APPLY, sur une fonction qui teste indéfiniment l'application d'une fonction passée en argument sur des valeurs qui sont fournies par l'utilisateur. Au cours d'une boucle sans fin (une boucle de type (WHILE T...) où la condition de boucle est nécessairement toujours vraie), le programme affiche un message d'invite à l'utilisateur pour qu'il entre des valeurs, grâce à la primitive PRINT. Celles-ci sont lues à l'aide de la fonction READ, qui renvoie à la suite du calcul une expression Lisp (atome ou liste) lue au clavier. APPLY se charge d'appliquer ces valeurs sur la fonction F passée en arguments, puis laisse à PRINT le soin d'afficher le résultat de cette application au terminal. Les primitives EVAL et APPLY ne sont pas des fonctions rajoutées par la suite et indépendantes du reste du langage, mais des voies d'accès directes à l'interpréteur du langage, que l'on appelle en Lisp l'évaluateur  : la fonction EVAL est ainsi tout simplement un appel à l'évaluateur. Grâce à cette propriété, il est facile d'écrire un interpréteur pour un autre langage, ou tout simplement de redéfinir Lisp en Lisp. Cette faculté de pouvoir se représenter à l'aide de son propre formalisme est le propre des langages « méta-circulaires »  : des langages qui peuvent se définir eux-mêmes. Un certain nombre de fonctions générales sont écrites en Lisp, pour pouvoir être modifiées aisément par l'utilisateur  : c'est le cas notamment des fonctions d'erreur et de la boucle générale d'interaction  : TOPLEVEL. En effet, cette dernière s'écrit très simplement comme une boucle sans fin où s'appellent mutuellement les primitives READ, EVAL et PRINT (fig. 2). Toute entrée proposée au clavier est systématiquement évaluée, et son résultat affiché au terminal. Très peu de langages offrent au programmeur la possibilité Janvier 1985 (de toplevel (whilet (setq it (read)) (print'= (eval it)))) Fig. 2. - La fonction TOPLEVEL constitue la boucle générale d'interaction. Les expressions entrées par l'utilisateur sont lues au clavier, évaluées, puis imprimées au terminal. (de mapcar (fnlst) (cond ((nulllst) ()) (t (cons (apply fn (list (carlst))) (mapcar fn (cdrlst)))))) Fig. 3. - La fonctionnelle MAPCAR permet d'appliquer successivement une fonction à tous les éléments d'une liste, et retourne la liste des résultats de ces applications. (de reduce (fnlst) (coud ((nulllst) ()) ((null (cdrlst))(carlst)) (t (apply fn (list (carlst) (reduce fn (cdrlst))))))) Fig. 4. - La fonctionnelle REDUCE compose l'ensemble des éléments d'une liste pour donner une valeur unique. de faire exécuter des données. Il est ainsi très difficile, sinon impossible, d'écrire des fonctions comme celles des figures précédentes dans un autre langage que Lisp. Seuls Apl (à l'aide de la fonction « exécute ») et Forth (par ses accès au compilateur) ont de telles potentialités. Les fonctionnelles Il est souvent intéressant de pouvoir appliquer un même calcul sur un ensemble de valeurs. Dans les langages impératifs classiques (Fortran, Pascal, Basic...), qui disposent de la notion de tableau comme structure de donnée principale, la boucle de répétition naturelle est le FOR dans laquelle une variable de boucle sert de compteur, et mesure le nombre de répétitions. En réalité, cet index ne sert bien souvent qu'à indiquer l'élément sur lequel portera le calcul. En Lisp, pour effectuer une opération répétitive, il n'est généralement pas nécessaire de faire intervenir un compteur. En effet, il est possible d'appliquer une même fonction sur un ensemble de valeurs sans utiliser d'index numérique, grâce à la fonction MAPCAR. Celle-ci prend comme argument une liste de valeurs et une fonction à un seul argument, et retourne la liste des résultats de ses applications successives sur tous les éléments de la liste. Par exemple, si l'on applique, à l'aide de MAPCAR, une fonction, ADDI, qui incrémente une valeur d'une unité, on obtient une liste de nombres, tous augmentés d'une unité : ? (addl 3) =4 ? (mapcar'addl'(1 2 3 4 5)) = (2 3 4 5 6) MAPCAR est elle-même une fonction, et, comme la plupart des fonctions Lisp, peut s'écrire dans le langage luimême. Sa définition est récursive (fig. 3). Elle consiste à appliquer successivement la fonction passée en argument sur le'premier élément de la liste à l'aide de APPLY. MAPCAR n'est pas une fonction ordinaire, mais une fonctionnelle, c'est-à-dire une fonction d'ordre supérieur qui prend des fonctions comme arguments, et les applique sur des ensembles de données. Il existe de nombreuses autres fonctionnelles en Lisp. Le domaine d'application peut être une liste (MAPCAR), une valeur unique (APPLY), ou même une structure générale, telle qu'un arbre (MAPSUB). Au lieu d'appliquer une même fonction sur une liste de valeurs, il est aussi possible d'appliquer un ensemble de fonctions sur une même valeur (AN DF, ORF, etc.). On ne retrouve pas toujours la totalité de ces fonctionnelles dans tous les systèmes Lisp, mais dans ce cas, l'utilisateur peut les définir pour ses propres besoins ; c'est le cas, par exemple, de la fonctionnelle RE- DUCE, dont la définition est donnée figure 4, et qui applique une fonction à deux arguments sur une liste d'éléments et retourne une valeur unique, formée.de la composition de toutes ces valeurs : ? (reduce'+'(1 2 3 4)) = 10 ? (reduce'*'(1 2 3 4 5)) = 120 La programmation par fonctionnelle introduit une nouvelle technique de programmation dans laquelle les calculs sont effectués sous une forme quasi parallèle, et où les variables tendent à jouer un rôle de moins en moins important, alors que la composition de fonctions prend une place prépondérante. Cette manière de concevoir les calculs était déjà présente dans un langage comme APL, mais il est plus facile de la généraliser dans des langages plus fonctionnels comme Lisp. Lambda, expressions et variables locales A l'encontre de la plupart des autres langages de programmation, Lisp permet de décrire des fonctions sans anonymes, c'est-à-dire qui n'ont pas été précisément nommées. Celles-ci sont appelées lambda expression à cause de leur origine liée au lambda calcul de Church. Une lambda expression se présente comme une liste dont l'élément de tête est l'atome LAMBDA, suivi d'une liste de variable et d'un corps, c'est-à-dire d'une suite d'expressions, qui correspond à la définition de cette fonction anonyme. Par exemple, (lambda (x y) (* x y)) est une lambda expression qui calcule le produit de deux nombres X et Y. Cette expression peut être placée dans une variable ou utilisée à la place d'une fonction : ? ((lambda (x y) (* x y)) 2 3) =6 ? (setq a'(lambda (x y) (* x y))) MICRO-SYSTEMES — 127



Autres parutions de ce magazine  voir tous les numéros


Liens vers cette page
Couverture seule :


Couverture avec texte parution au-dessus :


Couverture avec texte parution en dessous :


Micro Systèmes numéro 49 janvier 1985 Page 1Micro Systèmes numéro 49 janvier 1985 Page 2-3Micro Systèmes numéro 49 janvier 1985 Page 4-5Micro Systèmes numéro 49 janvier 1985 Page 6-7Micro Systèmes numéro 49 janvier 1985 Page 8-9Micro Systèmes numéro 49 janvier 1985 Page 10-11Micro Systèmes numéro 49 janvier 1985 Page 12-13Micro Systèmes numéro 49 janvier 1985 Page 14-15Micro Systèmes numéro 49 janvier 1985 Page 16-17Micro Systèmes numéro 49 janvier 1985 Page 18-19Micro Systèmes numéro 49 janvier 1985 Page 20-21Micro Systèmes numéro 49 janvier 1985 Page 22-23Micro Systèmes numéro 49 janvier 1985 Page 24-25Micro Systèmes numéro 49 janvier 1985 Page 26-27Micro Systèmes numéro 49 janvier 1985 Page 28-29Micro Systèmes numéro 49 janvier 1985 Page 30-31Micro Systèmes numéro 49 janvier 1985 Page 32-33Micro Systèmes numéro 49 janvier 1985 Page 34-35Micro Systèmes numéro 49 janvier 1985 Page 36-37Micro Systèmes numéro 49 janvier 1985 Page 38-39Micro Systèmes numéro 49 janvier 1985 Page 40-41Micro Systèmes numéro 49 janvier 1985 Page 42-43Micro Systèmes numéro 49 janvier 1985 Page 44-45Micro Systèmes numéro 49 janvier 1985 Page 46-47Micro Systèmes numéro 49 janvier 1985 Page 48-49Micro Systèmes numéro 49 janvier 1985 Page 50-51Micro Systèmes numéro 49 janvier 1985 Page 52-53Micro Systèmes numéro 49 janvier 1985 Page 54-55Micro Systèmes numéro 49 janvier 1985 Page 56-57Micro Systèmes numéro 49 janvier 1985 Page 58-59Micro Systèmes numéro 49 janvier 1985 Page 60-61Micro Systèmes numéro 49 janvier 1985 Page 62-63Micro Systèmes numéro 49 janvier 1985 Page 64-65Micro Systèmes numéro 49 janvier 1985 Page 66-67Micro Systèmes numéro 49 janvier 1985 Page 68-69Micro Systèmes numéro 49 janvier 1985 Page 70-71Micro Systèmes numéro 49 janvier 1985 Page 72-73Micro Systèmes numéro 49 janvier 1985 Page 74-75Micro Systèmes numéro 49 janvier 1985 Page 76-77Micro Systèmes numéro 49 janvier 1985 Page 78-79Micro Systèmes numéro 49 janvier 1985 Page 80-81Micro Systèmes numéro 49 janvier 1985 Page 82-83Micro Systèmes numéro 49 janvier 1985 Page 84-85Micro Systèmes numéro 49 janvier 1985 Page 86-87Micro Systèmes numéro 49 janvier 1985 Page 88-89Micro Systèmes numéro 49 janvier 1985 Page 90-91Micro Systèmes numéro 49 janvier 1985 Page 92-93Micro Systèmes numéro 49 janvier 1985 Page 94-95Micro Systèmes numéro 49 janvier 1985 Page 96-97Micro Systèmes numéro 49 janvier 1985 Page 98-99Micro Systèmes numéro 49 janvier 1985 Page 100-101Micro Systèmes numéro 49 janvier 1985 Page 102-103Micro Systèmes numéro 49 janvier 1985 Page 104-105Micro Systèmes numéro 49 janvier 1985 Page 106-107Micro Systèmes numéro 49 janvier 1985 Page 108-109Micro Systèmes numéro 49 janvier 1985 Page 110-111Micro Systèmes numéro 49 janvier 1985 Page 112-113Micro Systèmes numéro 49 janvier 1985 Page 114-115Micro Systèmes numéro 49 janvier 1985 Page 116-117Micro Systèmes numéro 49 janvier 1985 Page 118-119Micro Systèmes numéro 49 janvier 1985 Page 120-121Micro Systèmes numéro 49 janvier 1985 Page 122-123Micro Systèmes numéro 49 janvier 1985 Page 124-125Micro Systèmes numéro 49 janvier 1985 Page 126-127Micro Systèmes numéro 49 janvier 1985 Page 128-129Micro Systèmes numéro 49 janvier 1985 Page 130-131Micro Systèmes numéro 49 janvier 1985 Page 132-133Micro Systèmes numéro 49 janvier 1985 Page 134-135Micro Systèmes numéro 49 janvier 1985 Page 136-137Micro Systèmes numéro 49 janvier 1985 Page 138-139Micro Systèmes numéro 49 janvier 1985 Page 140-141Micro Systèmes numéro 49 janvier 1985 Page 142-143Micro Systèmes numéro 49 janvier 1985 Page 144-145Micro Systèmes numéro 49 janvier 1985 Page 146-147Micro Systèmes numéro 49 janvier 1985 Page 148-149Micro Systèmes numéro 49 janvier 1985 Page 150-151Micro Systèmes numéro 49 janvier 1985 Page 152-153Micro Systèmes numéro 49 janvier 1985 Page 154-155Micro Systèmes numéro 49 janvier 1985 Page 156-157Micro Systèmes numéro 49 janvier 1985 Page 158-159Micro Systèmes numéro 49 janvier 1985 Page 160-161Micro Systèmes numéro 49 janvier 1985 Page 162-163Micro Systèmes numéro 49 janvier 1985 Page 164-165Micro Systèmes numéro 49 janvier 1985 Page 166-167Micro Systèmes numéro 49 janvier 1985 Page 168-169Micro Systèmes numéro 49 janvier 1985 Page 170-171Micro Systèmes numéro 49 janvier 1985 Page 172-173Micro Systèmes numéro 49 janvier 1985 Page 174-175Micro Systèmes numéro 49 janvier 1985 Page 176-177Micro Systèmes numéro 49 janvier 1985 Page 178-179Micro Systèmes numéro 49 janvier 1985 Page 180-181Micro Systèmes numéro 49 janvier 1985 Page 182-183Micro Systèmes numéro 49 janvier 1985 Page 184-185Micro Systèmes numéro 49 janvier 1985 Page 186-187Micro Systèmes numéro 49 janvier 1985 Page 188-189Micro Systèmes numéro 49 janvier 1985 Page 190-191Micro Systèmes numéro 49 janvier 1985 Page 192-193Micro Systèmes numéro 49 janvier 1985 Page 194-195Micro Systèmes numéro 49 janvier 1985 Page 196-197Micro Systèmes numéro 49 janvier 1985 Page 198