Esercizi - deep-reverse (define (deep-reverse tree) (if (not (pair? tree)) tree (map deep-reverse (reverse tree)))) - append di due liste in termini di accumulate (define (append seq1 seq2) (accumulate cons seq2 seq1)) - length di una lista in termini di accumulate (define (length sequence) (accumulate (lambda (x y) (+ 1 y)) 0 sequence)) Carlo Strapparava - Informatica Esempio: Generare semplici frasi Come esempio di manipolazione simbolica proviamo a costruire un programma che genera semplici frasi in inglese Abbiamo bisogno prima di descrivere le possibili frasi tramite una grammatica Una frase (sentence) è un sintagma nominale (noun-phrase) seguita da un sintagma verbale (verb-phrase) Un sintagma nominale consiste o di un nome o di un aggettivo seguito da un sintagma nominale Un sintagma verbale consiste o di un verbo o di un verbo seguito da un avverbio Esempi di noun-phrases: cat, black cat, big black cat Esempi di verb-phrases: run, run quickly Esempi di senstence: the black cat runs quickly Carlo Strapparava - Informatica 1 Esempio: Generare semplici frasi Esistono vari formalismi per descrivere grammatiche Per esempio la BNF (Backus Normal Form o Backus-Naur Form) La nostra semplice grammatica diventa: S ::= NP VP NP ::= Noun | Adj NP VP ::= Verb | Verb Adv Il simbolo | indica una scelta tra alternative Carlo Strapparava - Informatica Esempio: Generare semplici frasi Proviamo a implementare il tutto Definiamo prima il nostro lessico: quali sono i nomi, verbi, aggettivi e avverbi (define noun-list (list 'dog 'cat 'professor 'student 'mouse)) (define verb-list (list 'runs 'eats 'sleeps 'drinks)) (define adjective-list (list 'red 'slow 'dead)) (define adverb-list (list 'quickly 'happily 'well)) (define (pick-random lst) ;; data una lista (list-ref lst (random (length lst)))) prende a caso un suo elemento Carlo Strapparava - Informatica 2 Esempio: Generare semplici frasi Definiamo i generatori di nomi, verbi, aggettivi e avverbi (define (noun) (list (pick-random noun-list))) (define (verb) (list (pick-random verb-list))) (define (adj) (list (pick-random adjective-list))) (define (adv) (list (pick-random adverb-list))) Carlo Strapparava - Informatica Esempio: Generare semplici frasi Supponiamo di avere una procedura either, per scegliere tar due alternative either prende come argomenti due procedure senza parametri, e a caso esegue una delle due (define (either a b) (if (= (random 2) 0) (a) (b))) Carlo Strapparava - Informatica 3 Esempio: Generare semplici frasi Finalmente definiamo le procedure nounphrase, verb-phrase, e sentence (define (noun-phrase) (either noun (lambda ()(append (adj) (noun-phrase))))) (define (verb-phrase) (either verb (lambda () (append (verb) (adv))))) (define (sentence) (append (append '(the) (noun-phrase)) (verb-phrase))) Carlo Strapparava - Informatica 4