Prolog: aritmetica e ricorsione



Documenti analoghi
Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

(X (, Y, Y Z ) Z " Z Z

TABELLA OPERATORI ARITMETICI

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

4 3 4 = 4 x x x 10 0 aaa

Lezione 8. La macchina universale

ALGEBRA DELLE PROPOSIZIONI

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

2. Leggi finanziarie di capitalizzazione

Corso di Informatica

SISTEMI DI NUMERAZIONE E CODICI

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Funzioni in C. Violetta Lonati

ESEMPIO 1: eseguire il complemento a 10 di 765

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Algebra Booleana ed Espressioni Booleane

Programmazione I - Laboratorio

Introduzione al MATLAB c Parte 2

Ottimizazione vincolata

Alcune nozioni di base di Logica Matematica

risulta (x) = 1 se x < 0.

Applicazioni lineari

GUIDA BASE DI PASCAL

Esempi di algoritmi. Lezione III

Derivate Limiti e funzioni continue

Funzioni funzione dominio codominio legge argomento variabile indipendente variabile dipendente

AA LA RICORSIONE

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme

Capitolo 2. Operazione di limite

Soluzione dell esercizio del 2 Febbraio 2004

1. PRIME PROPRIETÀ 2

Dimensione di uno Spazio vettoriale

Convertitori numerici in Excel

FUNZIONI ELEMENTARI - ESERCIZI SVOLTI

Laboratorio di Informatica

La selezione binaria

Il seguente esempio ha lo scopo di illustrare i 3 tipi di relazione 1:1,1:N,N:N. Tabella Conto: Tabella Conto:

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Esercizi Capitolo 6 - Alberi binari di ricerca

Plate Locator Riconoscimento Automatico di Targhe

Dispense di Informatica per l ITG Valadier

3 GRAFICI DI FUNZIONI

Esercizi su lineare indipendenza e generatori

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Matematica generale CTF

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

LE FUNZIONI A DUE VARIABILI

Logaritmi ed esponenziali

Calcolo del Valore Attuale Netto (VAN)

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno

Esercizi su. Funzioni

Testi di Esercizi e Quesiti 1

Semantica operazionale dei linguaggi di Programmazione

Descrizione di un algoritmo

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Interesse, sconto, ratei e risconti

Introduzione ai Metodi Formali

Come modificare la propria Home Page e gli elementi correlati

Fondamenti e didattica di Matematica Finanziaria

( x) ( x) 0. Equazioni irrazionali

Appunti di informatica. Lezione 2 anno accademico Mario Verdicchio

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Appunti sulla Macchina di Turing. Macchina di Turing

Gestione della memoria centrale

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

Proposta di soluzione della prova di matematica Liceo scientifico di Ordinamento

1 Serie di Taylor di una funzione

Comparatori. Comparatori di uguaglianza

Parte 1. Vettori di bit - AA. 2012/13 1.1

Gli algoritmi: definizioni e proprietà

ESERCIZI DI MATEMATICA FINANZIARIA DIPARTIMENTO DI ECONOMIA E MANAGEMENT UNIFE A.A. 2015/ Esercizi 4

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

DAL DIAGRAMMA AL CODICE

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Epoca k Rata Rk Capitale Ck interessi Ik residuo Dk Ek 0 S 0 1 C1 Ik=i*S Dk=S-C1. n 0 S

Pertanto la formula per una prima approssimazione del tasso di rendimento a scadenza fornisce

Traccia di soluzione dell esercizio del 25/1/2005

GESTIONE INFORMATICA DEI DATI AZIENDALI

RAPPRESENTAZIONE GRAFICA DEGLI ALGORITMI

Matematica in laboratorio

1 Giochi a due, con informazione perfetta e somma zero

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Sistemi di Numerazione

ESERCIZI DI MATEMATICA FINANZIARIA DIPARTIMENTO DI ECONOMIA E MANAGEMENT UNIFE A.A. 2015/ Esercizi: lezione 24/11/2015

LEZIONE 7. Esercizio 7.1. Quale delle seguenti funzioni è decrescente in ( 3, 0) e ha derivata prima in 3 che vale 0? x x2. 2, x3 +2x +3.

2 Argomenti introduttivi e generali

Una percentuale di una certa importanza nel mondo economico è il tasso di interesse. Il tasso di

CAPITOLO 16 SUCCESSIONI E SERIE DI FUNZIONI

(anno accademico )

LA MACCHINA FRIGORIFERA E LA POMPA DI

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Macchine di Turing, problemi ricorsivi e ricorsivamente enumerabili

Parte II Indice. Operazioni aritmetiche tra valori rappresentati in binario puro. Rappresentazione di numeri con segno

Concetto di Funzione e Procedura METODI in Java

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Polli e conigli. problemi Piano cartesiano. Numeri e algoritmi Sistemi e loro. geometrica. Relazioni e funzioni Linguaggio naturale e

Insiemi di livello e limiti in più variabili

Transcript:

Capitolo 13 Prolog: aritmetica e ricorsione Slide: Aritmetica e ricorsione 13.1 Operatori aritmetici In logica non vi è alcun meccanismo per la valutazione di funzioni, che è fondamentale in un linguaggio di programmazione. In Prolog i numeri interi son rappresentati da termini come s(s(s(0)) dove s(0) indica semplicemente il successore del numero 0, dunque 1. Pertanto richiamando n volte il successore di 0, avremo denito il numero n. Com'è possibile dunque denire le operazioni aritmetiche? Facciamo due esempi: 1 somma(x, 0, X) 2 somma( s (X), Y, s (Z) ) : somma(x, Y, Z) Questo è un esempio di come denire la somma. Partiamo denendo la somma di un numero con 0, poi deniamo la somma di due numeri diversi da 0, cui ci si arriva per induzione. Vediamo invece come denire il prodotto: 1 prodotto (X, 0, 0 ) 2 prodotto (X, s (Y), Z) : prodotto (X, Y, W), somma(x, W, Z) Sebbene sia possibile denire le operazioni matematiche come abbiamo appena visto, tale approccio non è utilizzabile nella pratica, dunque Prolog fornisce dei predicati predeniti per la valutazione delle espressioni. Esistono dunque sia operatori binari che operatori unari, che vediamo qui riassunti: 1

2 CAPITOLO 13. PROLOG: ARITMETICA E RICORSIONE Unari Binari -, exp, log, ln, sin, cos, tg +, -, *, \, div, mod Per gli operatori binari, Prolog supporta sia la consueta notazione in- ssa, sia la notazione pressa, dunque le seguenti forme sono equivalenti: +(2, 3) 2 + 3 Prolog riconosce come atomi sia i numeri interi, sia quelli in oating point. 13.2 Il predicato is is è uno speciale predicato predenito che consente di valutare le espressioni ed in un certo senso di assegnare dei valori a delle variabili. Vediamo subito come funziona. Intanto anche il predicato is accetta sia la notazione pressa, sia quella inssa: 1 i s (T, Expr ) è equivalente a: 1 T i s Expr Gli operatori sono: T: un atomo numerico o una variabile; Expr: un'espressione. L'espressione Expr viene valutata ed il risultato viene unicato con T. Alcuni esempi renderanno la trattazione più chiara: il seguente esempio unica la variabile X con il risultato della somma 2 + 3. In X troveremo dunque il risultato di tale operazione: 1 : X i s 2+3. 2 yes X=5 l'esempio qui sotto è leggermente più elaborato. Calcola il valore di 2+3 assegnandolo alla variabile X1. Usa poi il valore di X1 per calcolarne l'esponenziale ed unicarlo con X2. Per ultimo calcola X1 X2 e lo unica con X:

13.2. IL PREDICATO IS 3 1 : X1 i s 2+3, X2 i s exp (X1), X i s X1 X2. 2 y e s X1=5 X2=148.413 X3=742.065 adesso utilizziamo invece di una variabile un atomo numerico e confrontiamolo con l'esito di un'operazione aritmetica: 1 : 0 i s 3 3 2 yes in questo quarto esempio proviamo a vericare se due espressioni hanno lo stesso risultato: 1 : X i s 2+3, X i s 5+4. 2 no Dopo il primo goal, la variabile X ha il valore 5, dunque il secondo goal coincide con: 1 : 5 i s 4+1 riprendiamo l'esempio precedente, ma applichiamo una modica: 1 : X i s 2+3, X i s X+1. 2 no È importante notare che alla variabile X, nel secondo goal non viene assegnato il valore X+1 in quanto le variabili sono write-once. Il secondo goal equivale a chiedere se X è uguale a X+1 e chiaramente ciò provoca un fallimento. nel prossimo esempio proviamo ad eettuare un calcolo utilizzando però la variabile Y non istanziata: 1 : X i s Y 1. 2 no Come vediamo otteniamo un fallimento. essere istanziate! Le variabili devono sempre con il prossimo esempio mostriamo che con il predicato is l'ordine dei goal è importante: 1 ( a ) : X i s 2+3, Y i s X+1. 2 (b) : Y i s X+1, X i s 2+3.

4 CAPITOLO 13. PROLOG: ARITMETICA E RICORSIONE Come possiamo immaginare infatti, il goal a produce X = 5, Y = 6, mentre il goal b fallirebbe dal momento che X non è istanziata quando si va a svolgere il primo sotto goal. Il predicato is è un esempio di predicato non reversibile e come conseguenza tutte le funzioni che fanno uso di tale predicato non sono in generale reversibili. Un'espressione viene valutata soltanto se è il secondo argomento del predicato is. Lo vediamo con il seguente esempio: 1 p(a,2+3 5). 2 q (X,Y) : p(a,y), X i s Y. 3 : q (X,Y). 4 yes X=17 Y=2+3 5 Come si fa ad arrivare a tale risultato? Il goal q(x, Y ) unica con l'espressione alla seconda riga. Il primo goal di questa espressione unica con il fatto noto, dunque ad Y viene associato 2 + 3 5, ma tale espressione non viene valutata. Il secondo goal viene unicato assegnando a X il valore dell'espressione contenuta in Y. Questa volta l'espressione viene valutata in quanto è il secondo parametro dell'operatore is. 13.3 Operatori relazionali Prolog fornisce anche degli operatori (con notazione inssa) per confrontare i valori delle espressioni: Op. relazionali >, <, >=, =<, ==, =/= L'ultimo è l'operatore di disuguaglianza. Indicando uno qualunque degli operatori relazionali con REL possiamo dire che tali operatori vengono utilizzati nella forma: 1 Expr1 REL Expr2 Le espressioni Expr1 ed Expr2 vengono valutate (ovviamente devono essere completamente istanziate) ed i loro risultati vengono confrontati.

13.4. FUNZIONI 5 13.4 Funzioni Volendo denire una funzione di n argomenti, questa può essere realizzata in Prolog tramite un predicato a n+1 argomenti, come segue: 1 f (X1, X2,..., Xn, Y) : <c a l c o l o di Y> Il predicato f accetta n+1 parametri che sono gli n argomenti della funzione e la variabile in cui inserire il risultato. Possiamo vedere ora qualche esempio: fattoriale: la funzione fattoriale è una funzione che prende in input un valore x e restistuisce 1 se x=0, altrimenti restituisce 1 2... x 1 x. Questo secondo risultato può essere riscritto ricorsivamente come: f attoriale(x) = f attoriale(x 1) x. Sulla base di queste considerazioni possiamo dunque denire una funzione fatt (in realtà è un predicato) che calcola e restituisce proprio il fattoriale: 1 f a t t ( 0, 1 ). 2 f a t t (N,Y) : N>0, N1 i s N 1, f a t t (N1, Y1), Y i s N Y1. A questo punto possiamo provarla: 1 : f a t t (6,X). 2 yes X=720 massimo comun divisore fra due numeri interi positivi: il massimo comune divisore fra due numeri si calcola secondo queste due semplici regole: l'mcd fra X>0 e 0 è X; l'mcd fra X>0 ed Y>0 è pari all'mcd fra em Y e X mod Y. Ricaviamo quindi: 1 mcd(x, 0,X). 2 mcd(x,y, Z) : Y>0, X1 i s X mod Y, mcd(y, X1, Z). valore assoluto: vediamo due possibili formulazioni: 1 abs ( 0, 0 ). 2 abs (X,X) : X>0. 3 abs (X, Y) : X<0, Y i s (X 2 X). o alternativamente:

6 CAPITOLO 13. PROLOG: ARITMETICA E RICORSIONE 1 abs (X, X) : X>=0. 2 abs (X, Y) : X<0, Y i s X. parità: scriviamo una funzione che verichi se un numero è pari: 1 p a r i (X) : 0 i s (X mod 2). O in una via più elaborata: 1 p a r i ( 0 ). 2 p a r i (X) : X>0, X1 i s X 1, d i s p a r i (X1). 3 d i s p a r i (X) : X>0, X1 i s X 1, p a r i (X1). 13.5 Ricorsione ed iterazione Il Prolog non fornisce alcun costrutto per l'iterazione, nessun ciclo for, while, repeat ecc. L'unico meccanismo per ottenere iterazione è la ricorsione. Un particolare tipo di ricorsione è la cosiddetta ricorsione tail. Una funzione ricorsiva tail è una funzione che dopo aver richiamato sè stessa, non eettua altre operazioni. In altre parole f è ricorsiva tail se sul risultato della chiamata ricorsiva di f non vengono eettuate altre operazioni. La ricorsione tail viene equiparata ad una denizione per iterazione. Nel caso di ricorsione la regola generale dice che la valutazione richiede l'uso dello stack ed in particolare il caricamento in cima allo stack di una copia del record d'attivazione della funzione per ogni chiamata della f stessa. Se la funzione è denita con ricorsione tail l'uso dello stack è inutile. Cerchiamo di capire ciò con un esempio. Consideriamo il seguente blocco di pseudo codice: (X): if X = 0 then g(x) else f(x 1) Supponiamo di richiamare f(2). Nello stack viene inserito un record di attivazione per contenente < X = 2,... >. Poi viene richiamata dal codice la funzione stessa, ma con argomento 1: f(1). Nello stack avremo quindi un nuovo record di attivazione: < X = 1,... >, < X = 2,... >. A questo punto viene richiamata f(0) e lo stack assume la forma: < X = 0,... >, < X = 1,... >, < X = 2,... >. A questo punto si può calcolare g(0) (e la sua chiamata provocherà l'aggiunta nello stack di un'altra voce < X = 0,... > in testa). All'uscita di g(0) viene rimosso il primo record di attivazione, e poi man mano tutti gli altri: prima il record corrispondente a f(0), poi a f(1), poi a f(2). Il salvataggio dei valori nello stack è necessario

13.5. RICORSIONE ED ITERAZIONE 7 per poter poi eettuare delle operazioni all'uscita delle varie funzioni, ma avendo usato la ricorsione tail non vi saranno altre elaborazioni all'uscita da una chiamata di funzione. Questo ci fa capire dunque che il salvataggio nello stack per tali funzioni è inutile e quindi si può attuare un'ottimizzazione. L'ottimizzazione della ricorsione tail consiste nel valutare una funzione ricorsiva tail f mediante un processo iterativo, cioè caricando un solo record di attivazione per f sullo stack di esecuzione. Con questa ottimizzazione non servirà in memoria uno spazio proporzionale al numero di chiamate ricorsive, ma uno spazio costante. In Prolog l'ottimizzazione della ricorsione tail risulta più complicata a causa del non determinismo e della presenza di punti di scelta nella denizione delle clausole. A questo proposito vediamo un piccolo esempio: 1 p(x) : c1 (X), g (X). 2 p(x) : c2 (X), h1 (X,Y), p(y). 3 p(x) : c3 (X), h2 (X,Y), p(y). Se viene scelta la seconda clausola per valutare il goal p(z), bisogna ricordarsi che la terza è ancora un punto di scelta aperto e bisogna mantenere alcune informazioni nel record di attivazione di p(z). Se invece viene scelta la terza (in generale l'ultima) clausola, non è più necessario mantenere alcuna informazione nel record di attivazione dal momento che non vi sono punti di scelta aperti e l'ottimizzazione può essere eettuata. Quindi in Prolog l'ottimizzazione della ricorsione tail è possibile solo se la scelta nella valutazione di un predicato p è deterministica o, meglio, se al momento della chiamata ricorsiva (n + 1)-esima di p non vi sono alternative aperte per la chiamata al passo n-esimo (ossia alternative che potrebbero essere considerate in fase di backtracking). Quasi tutti gli interpreti Prolog eettuano l'ottimizzazione della ricorsione tail ed è pertanto conveniente usare il più possibile ricorsione di tipo tail. Riprendiamo la denizione della funzione fattoriale: 1 f a t t ( 0, 1 ). 2 f a t t (N,Y) : N>0, N1 i s N 1, f a t t (N1, Y1), Y i s N Y1. Come possiamo notare, tale funzione non è ricorsiva tail in quanto dopo la chiamata ricorsiva di fatt nella seconda clausola si eettua un'ulteriore elaborazione, proprio sul risultato di tale funzione. Vediamo come sia possibile riscrivere questa funzione come ricorsiva tail: 1 f a t t 1 (N,Y) : f a t t 1 (N, 1, 1,Y). 2 f a t t 1 (N,M,A,A) : M>N. 3 f a t t 1 (N,M, Ai, Ao) : At i s Ai M, M1 i s M+1, f a t t 1 (N,M1, At, Ao).

8 CAPITOLO 13. PROLOG: ARITMETICA E RICORSIONE dove si è fatto uso di Ai e Ao che sono rispettivamente un accumulatore in ingresso (inizializzato a 1) ed un accumulatore in uscita. Sono cioè due contatori, uno passato in ingresso ed uno fornito in uscita che, all'ultima iterazione, corrisponderà al valore del fattoriale. Vediamo un'ultimo esempio: come realizzare un programma che calcoli la successione di Fibonacci. Lo facciamo conu na funzione non ricorsiva tail: 1 f i b o ( 0, 0 ). 2 f i b o ( 1, 1 ). 3 f i b o (X, Z) : Y1 i s X 1, Y2 i s X 2, f i b o (Y1,A), f i b o (Y2,B), Z i s A+B.