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