La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

Présentations similaires


Présentation au sujet: "CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures."— Transcription de la présentation:

1 CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures de données composées Évaluation de fonctions Construction de listes et accès aux éléments Expressions fonctionnelles et définition de fonctions contrôle Fonctions de haut niveau

2 CSI 3125, Scheme, page 2 Lisp La programmation fonctionnelle a commencé vers la fin des années 1950 (Veuillez relire la section 2.4). Plusieurs dialectes, Lisp 1.5 (1960), Scheme (1975), Common Lisp (1985)… [LISP = LISt Processor] [Il y a aussi dautre langages fonctionnels: Hope, ML, Miranda, Haskell.] Plusieurs langages fonctionnels (dont Lisp) ont comme fondation mathématique le -calcul (lambda-calcul), un système qui permet aux fonctions dêtre les valeurs dune expression.

3 CSI 3125, Scheme, page 3 Lisp (2) Mécanismes de control fondamentaux: –Application de fonctions –Composition de fonctions –Instructions conditionnelles –récursivité Les structures de données sont simples: –listes, –atomes (symboles et nombres).

4 CSI 3125, Scheme, page 4 Les programmes et données sont exprimés à laide de la même syntaxe: –Lapplication de fonctions et les instructions conditionnelles sont écrites comme des listes, en parenthèse, avec le nom de linstruction comme préfixe. –Le programme et les données sont distinguées selon le contexte. Cette uniformité des données et du programme permettent une grande flexibilité et expressivité: –Les programmes peuvent être manipulés comme des données. Un interpréteur de LISP d une page en LISP a été à la base de la première implémentation en bootstrapping dun langage de programmation (une technique très puissante) Lisp (3)

5 CSI 3125, Scheme, page 5 5 fonctions primitives: consconstruit une liste, carla tête dune liste, cdrla queue dune liste, eqÉgalité datomes (Booléenne), atomVérifie si une atome (Booléenne); Deux autres opérations essentielles: –Lévaluation dexpressions, –Appliquer une fonction aux paramètres (déjà évalués) Lisp (4)

6 CSI 3125, Scheme, page 6 Lisp est utilisé de façon interactive (comme Prolog): –Aucun programme principal, –Linterpréteur évalue les expressions et retourne leur valeur (les expressions peuvent invoquer des fonctions très compliquées), –Un programme Lisp est une collection de fonctions qui peuvent être invoquées directement ou indirectement par linterpréteur. –Toute expression est évaluée: Il faut dire explicitement à Lisp de ne pas évaluer quelque chose (avec quote) Un atome est traité littéralement: il nest que lui même et na dautre valeur que son nom. Lisp (5)

7 CSI 3125, Scheme, page 7 Lisp 1.5 à plusieurs points faibles: Syntaxe peu commode (mais élégante et uniforme). Règles à porté dynamique [Que nous verrons plus tard] Traitement inconsistant des fonctions en tant que paramètres (due à la porté dynamique). Lisp (6)

8 CSI 3125, Scheme, page 8 Un Resumé du Scheme Scheme est un sous-ensemble de Lisp. Il fait la distinction entre nombres et symboles La porté est lexicale (plutôt que dynamique) Corrige le problème du traitement des paramètres (grâce à la porté lexicale): –Les fonctions sont des objets de première classe, cest à dire quelles peuvent être créées, assignées à des variables, passées comme paramètres, retournées comme valeurs. Les structures de données, en Scheme sont simples, uniformes et versatiles. Comme pour Lisp 1.5, on les appelles S-expressions.

9 CSI 3125, Scheme, page 9 Le system Scheme pour ce cours Veuillez vous connecter (via ssh ) a site1, et taper scm au prompt. % scm SCM version 5d3, Copyright (C) Free Software Foundation. SCM comes with ABSOLUTELY NO WARRANTY; for details type `(terms)'. This is free software, and you are welcome to redistribute it under certain conditions; type `(terms)' for details. ;loading /usr/local/lib/slib/require ;done loading /usr/local/lib/slib/require.scm ;loading /usr/local/lib/scm/Transcen ;done loading /usr/local/lib/scm/Transcen.scm ;Evaluation took 50 mSec (0 in gc) cells work, 4000 env, bytes other > A ce moment la, vous êtes en dialogue avec la boucle interactive supérieure. Vous pouvez, par example, taper (terms) ou (exit) ou (quit) ou vous pouvez continuer…

10 CSI 3125, Scheme, page 10 Une session Scheme % scm > ( cons 'alpha '( beta ) ) (alpha beta) > ( symbol? 'alpha ) #t > ( symbol? '( alpha ) ) #f

11 CSI 3125, Scheme, page 11 > ( null? 'alpha ) #f > ( null? () ) #t > ( number? 'alpha ) #f > ( number? 23 ) #t > ( symbol? alpha ) ERROR: unbound variable: alpha ; in expression: (... alpha) ; in top level environment. Une session Scheme (2)

12 CSI 3125, Scheme, page 12 > ( define alpha 5 ) # > ( number? alpha ) #t > ( symbol? alpha ) #f > ( cdr ( cons 'x '( y z ) ) ) (y z) > ( cons 'x ( cdr '( y z ) ) ) (x z) > ( ) 3 Une session Scheme (3)

13 CSI 3125, Scheme, page 13 > ( define ( addOne x ) ( + x 1 ) ) # > ( addOne ( addOne 15 ) ) 17 > ( define ( myAnd x y ) ( if x y #f ) ) # > ( myAnd ( symbol? '(a) ) ( eq? 'a 'a ) ) #f > ( and ( symbol? '(a) ) ( eq? 'a 'a ) ) #f Une session Scheme (4)

14 CSI 3125, Scheme, page 14 > ( define ( myOr x y ) ( if x #t y ) ) # > ( myOr ( symbol? '(a) ) ( eq? 'a 'a ) ) #t > ( or ( symbol? '(a) ) ( eq? 'a 'a ) ) #t > ( eq? 'a 'a ) #t > ( eq? 'a 'b ) #f > ( eq? '( a ) '( a ) ) #f Une session Scheme (5)

15 CSI 3125, Scheme, page 15 > ( define ( numberList? x ) ( if ( not ( list? x ) ) #f ( if ( null? x ) #t ( if ( not ( number? ( car x ) ) ) #f ( numberList? ( cdr x ) ) ) ) ) ) # > ( numberList? ' ( ) ) #t Une session Scheme (6)

16 CSI 3125, Scheme, page 16 > ( define ( numberList? x ) ( cond ( ( not ( list? x ) ) #f ) ( ( null? x ) #t ) ( ( not ( number? ( car x ) ) ) #f ) ( else ( numberList? ( cdr x ) ) ) ) > ( numberList? ' ( ) ) #t > ( numberList? ' ( bad 4 ) ) #f Une session Scheme (7)

17 CSI 3125, Scheme, page 17 > ( define ( eqExpr? x y ) ( cond ( ( symbol? x ) ( eq? x y ) ) ( ( number? x ) ( eq? x y ) ) ; x must be a list now: ( ( null? x ) ( null? y ) ) ; x must be a non-empty list now: ( ( null? y ) #f ) ( ( eqExpr? ( car x ) ( car y ) ) ( eqExpr? ( cdr x ) ( cdr y ) ) ) ( else #f ) ) > ( eqExpr? '( a b ( c d ) ) '( a b ( c d ) ) ) #t > ( eqExpr? '( a b ( c d ) ) '( a b ( c d e) ) ) #f Une session Scheme (8)

18 CSI 3125, Scheme, page 18 > ( define ( member? K L ) ( cond ( (null? L ) #f ) ( ( eqExpr? K ( car L ) ) #t ) ( else ( member? K ( cdr L ) ) ) ) # > ( member? 'aa '( bb cc aa ee rr tt ) ) #t > ( member? 'aa '( bb cc (aa) ee rr tt ) ) #f Une session Scheme (9)

19 CSI 3125, Scheme, page 19 > ( define ( append L1 L2 ) ; built-in! (if ( null? L1 ) L2 ( cons ( car L1 ) ( append ( cdr L1 ) L2 ) ) ) ) WARNING: redefining built-in append # > ( append '( ab bc cd ) '( de ef fg gh ) ) (ab bc cd de ef fg gh) > ( exit ) ;EXIT Une session Scheme (10)

20 CSI 3125, Scheme, page 20 Structures de données simples Nombres: entiers ou floats. Une variable est un nom lié à une donnée, par exemple: (define pi ) Une variable a un type implicite, dépendant de sa valeur. Elle peut prendre une valeur dun autre type: (set! pi ) (set! pi 'alpha) (set! pi (cons pi '(rho))) Un symbole est un nom nayant dautre valeur que lui même.

21 CSI 3125, Scheme, page 21 Structures de données composées Le format générale dune liste: (E 1 E E n ) où E i est une S-expression. Dépendamment du contexte, une liste peut être traité littéralement (comme une donnée): ((William Shakespeare) (The Tempest)) ou comme une application de fonction avec les paramètres passés par valeur: (append x y)

22 CSI 3125, Scheme, page 22 Une liste (E 1 E E n ) est produite par cons: (cons E 1 (cons E 2... (cons E n ())... )) produit: (E 1. (E 2... (E n. ( ))... )) On a aussi les paires pointées, peu utilisées en pratique: cons( ) produit: (. ) Structures de données composées (2)

23 CSI 3125, Scheme, page 23 Évaluation de fonctions Avec: une liste (E 0 E 1... E n ) Étape 1 Évalue E 0 pour obtenir V 0, Évalue E 1 pour obtenir V 1,......, Évalue E n pour obtenir V n. V 0 doit être une fonction, V 1,..., V n sont des données. Étape 2 Applique V 0 à V 1,..., V n Cest à dire, calcule V 0 (V 1,..., V n ).

24 CSI 3125, Scheme, page 24 Lévaluation est bloquée par quote: (quote pi) ou de façon équivalente: 'pi Si pi est défini ainsi: (define pi ) Exemples: (* 2.0 pi)retourne (* 2.0 'pi)paramètre invalide ('* 2.0 'pi)fonction invalide (write 'pi)affiche le symbole pi (write pi)affiche Quote

25 CSI 3125, Scheme, page 25 Construction de listes et accès aux éléments Les listes sont définies récursivement: Une liste vide: (), Une liste non-vide: (cons ) où is a list. La tête et la queue dune liste: (car (cons )) retourne (cdr (cons )) retourne (car ()) et (cdr ()): paramètre invalide

26 CSI 3125, Scheme, page 26 Une convention de notation pour accéder aux autres éléments de la liste: (caar x) (car (car x)) (cdadr x) (cdr (car (cdr x)))) Par exemple, lévaluation suivante se fait en 4 étapes: (caadar '((p ((q r) s) u) (v))) (caadr '(p ((q r) s) u)) (caar '(((q r) s) u)) (car '((q r) s)) '(q r) Le deuxième élément dune liste x si il existe: (cadr x) Le troisième, quatrième,... : (caddr x), (cadddr x),... Accès aux éléments

27 CSI 3125, Scheme, page 27 car, cdr, cons sont les fonctions primitives qui permettent laccès aux listes. Trois autres sont des prédicats: des fonctions qui retournent #t ou #f. (symbol? x) #t ssi x est un symbole symboles, (number? x) –ssi x est un nombre, (eq? x y) –ssi x et y sont des symboles et sont égaux. Fonctions primitives

28 CSI 3125, Scheme, page 28 Autre fonctions (elle peuvent être définie à partir des primitives): (equal? x y) vrai ssi x et y sont des objets identiques (pas nécessairement atomique) (null? x) si x est () – la liste vide. (append x y) concatène les listes x et y. Autre fonctions

29 CSI 3125, Scheme, page 29 Une définition lie lexpression dune fonction à un nom: (define (square x) (* x x)) ou, de façon équivalente: (define square (lambda (x) (* x x))) Le nom dune fonction peut être évaluée: > square # Les fonctions nont pas nécessairement de nom! > ((lambda (x) (* x x x)) 3) 27 Définir des fonctions

30 CSI 3125, Scheme, page 30 Les structures de contrôle en Scheme, comme en Lisp, sont simple. Il nexiste pas de boucles. Il y a lapplication de fonctions, lexpression conditionnelle, et la séquence (une concession aux programmeurs habitués aux langages impératifs): > (begin (print 'okay) (print '(great))) okay (great) ;Evaluation took [...] (great) La valeur retournée par (begin...) est la valeur du dernier terme. Contrôle

31 CSI 3125, Scheme, page 31 Instructions conditionnelles (cond (C 1 E 1 ) (C 2 E 2 ) (C n E n ) (else E n+1 )) La dernière partie, (else E n+1 ), est optionnelle. (C i E i ) représente une paire condition-expression. Les pairs sont évaluées de gauche à droite. On arrête quand on trouve un C i qui est vrai (qui retourne #t ). On retourne le E i correspondant. else est évalué comme #t.

32 CSI 3125, Scheme, page 32 Cas spécial: if (cond (C 1 E 1 ) (else E 2 )) Peut être abrégé: (if C 1 E 1 E 2 )

33 CSI 3125, Scheme, page 33 Dautre exemples de fonctions (define (same_neighbours? l) (cond ((null? l) #f) ((null? (cdr l)) #f) ((equal? (car l)(cadr l)) #t) (else (same_neighbours? (cdr l))) )

34 CSI 3125, Scheme, page 34 Pile en Scheme (define (empty? stack) (null? stack) ) (define (pop stack) (if (empty? stack) stack (cdr stack) ) (define (push el stack) (cons el stack) ) (define (top stack) (if (empty? stack) () (car stack) )

35 CSI 3125, Scheme, page 35 Minimum dune liste (define (minL Lst) (if (null? Lst) Lst (minL-aux (car Lst)(cdr Lst)) ) (define (minL-aux Elt Lst) (cond ((null? Lst) Elt) ((> Elt (car Lst)) (minL-aux (car Lst)(cdr Lst))) (else (minL-aux Elt (cdr Lst))) )

36 CSI 3125, Scheme, page 36 (define (minL-aux Elt Lst) (if (null? Lst) Elt (let ((carl (car Lst)) (cdrl (cdr Lst))) (if (> Elt carl) (minl-aux carl cdrl) (minl-aux Elt cdrl) ) ) Minimum dune liste, une variante a porte locale

37 CSI 3125, Scheme, page 37 > (define (quadruple x) (let ((double (lambda (x) (+ x x)))) (double (double x)) ) # > (quadruple 8) 32 > (double 8) unbound variable: double ; in expression: (... double 8) ; in top level environment. Un autre exemple de portée locale

38 CSI 3125, Scheme, page 38 > (define (quadruple x) (define (double x) (+ x x)) (double (double x)) ) # > (quadruple 8) 32 > (double 8) unbound variable: double ; in expression: (... double 8) ; in top level environment. Un autre exemple de portée locale (2)

39 CSI 3125, Scheme, page 39 Fonctions de haut-niveau Certaine fonctions prennent des fonctions comme paramètres. > (define (combine Fun1 Fun2 X) (Fun1 (Fun2 X)) ) > (combine (lambda (x) (+ 1 x)) (lambda (x) (* 2 x)) 6) > (combine (lambda (x) (* 2 x)) (lambda (x) (+ 1 x)) 6) Équivalent à: > ((lambda (x) (+ 1 x)) ((lambda (x) (* 2 x)) 6)) > ((lambda (x) (* 2 x)) ((lambda (x) (+ 1 x)) 6))

40 CSI 3125, Scheme, page 40 (define (map F Lst) (if (null? Lst) Lst (cons (F (car Lst)) (map F (cdr Lst))) ) Fonctions de haut-niveau (2) Un exemple classique: map, lopération qui applique une fonction aux éléments dune liste: (E 1 E E n ) ((f E 1 ) (f E 2 ) (f E n )) Par exemple (map (lambda(x) (+ x 1)) '(1 2 3)) retourne: (2 3 4)

41 CSI 3125, Scheme, page 41 Une version de map qui applique la fonction à chaque éléments sans retourner la liste résultante: Fonctions de haut-niveau (3) (define (do-for-all F L) (if (null? L) L (let ((dummy (F (car L)))) (do-for-all F (cdr L)) ) ) ) Par exemple: (do-for-all write '(1 2 3))

42 CSI 3125, Scheme, page 42 Voici un petit exercice: (define (f) (lambda (x) (+ 1 x))) Quelle est la valeur de cette fonction? Fonctions de haut-niveau (4)

43 CSI 3125, Scheme, page 43 Réducteurs Soit F une opération binaire, cest à dire, à deux paramètres. Soit F 0 une constante. On veut exprimer la transformation suivante: (E 1 E E n ) (F E 1 (F E 2 (F (F E n F 0 ) ))) Qui sexprime plus facilement avec une notation infixe: (E 1 E E n ) E 1 F E 2 F F E n F F 0

44 CSI 3125, Scheme, page 44 Example: (E 1 E E n ) E 1 + E E n + 0 (E 1 E E n ) E 1 * E 2 * * E n * 1 Reducteurs (2) (define (reduce F F0 L) (if (null? L) F0 (F (car L) (reduce F F0 (cdr L))) )

45 CSI 3125, Scheme, page 45 > (reduce + 0 '( )) > (reduce * 1 '( )) > (reduce (lambda (x y) (+ x y 1)) 8 '(1 2 3)) > (reduce cons () '( )) > (reduce append () '((1) (2) (3))) Reducers (3)

46 CSI 3125, Scheme, page 46 Noms pre-determines Manipulation de liste car cdr cons append list length caar, cadr, cdar, cddr,..., caaaar,..., cddddr Pour définir define lambda

47 CSI 3125, Scheme, page 47 Logique not and or #t #f Contrôle if cond else let begin Arithmétique et comparaison + < - > * <= / >= max = min Noms pré-determinés (2)

48 CSI 3125, Scheme, page 48 Prédicats symbol? number? integer? real? list? null? eq? equal? procedure? fonctions I/O write display print read Divers load map quote set! Noms pré-déterminés (3)


Télécharger ppt "CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures."

Présentations similaires


Annonces Google