Esecuzione dei programmi Prolog Liste ed operatori aritmetici

Slides:



Advertisements
Presentazioni simili
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità E1 Dallanalisi del problema alla definizione dellalgoritmo.
Advertisements

Linguaggi di programmazione
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
Linguaggi di Programmazione (AA 2002/2003)
esponente del radicando
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Iterazione enumerativa (for)
Sistemi basati su conoscenza Esercizi Prolog
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
EQUAZIONI DI PRIMO GRADO
LISP.
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente) ITERAZIONE: ripetere piu volte una sequenza di operazioni istruzioni: for, while, do.
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Modelli simulativi per le Scienze Cognitive
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Semantica per formule di un linguaggio proposizionale p.9 della dispensa.
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Programmazione logica
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
Programmazione in Java Claudia Raibulet
4 Tipi di dati & variabili
IL CALCOLO COMBINATORIO
PROGRAMMAZIONE: linguaggi
Lezione 6 Strutture di controllo Il condizionale
Il primo passo: I basilari del Prolog
Recuperare tutte le risposte Gestione di input-output Fabio Massimo Zanzotto (slides di Andrea Turbati)
Fabio Massimo Zanzotto (slides di Andrea Turbati con aggiunte)
Strategie per il problem solving
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Modulo 4: EXCEL LEZIONE 4 Modulo EXCEL Alessandro Celi.
Definire operatori Strutture dati Fabio Massimo Zanzotto (slides di Andrea Turbati)
Linguaggi e Modelli di Programmazione Fabio Massimo Zanzotto.
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
Ordinamento e Operazioni su Strutture Dati Fabio Massimo Zanzotto.
Recuperare tutte le risposte Gestione di input-output Fabio Massimo Zanzotto (slides di Andrea Turbati)
Percorsi su grafi, Sottoalberi Comuni e Programmazione Dinamica Fabio Massimo Zanzotto.
Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Rappresentazione degli algoritmi
La ricorsione.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
Rappresentazioni a lunghezza fissa: problemi
Rappresentazione dell'informazione
La codifica dei numeri.
Conversione binario-ottale/esadecimale
Diagrammi a blocchi.
Informatica e Informatica di Base
Corso integrato di Matematica, Informatica e Statistica Informatica di base Linea 1 Daniela Besozzi Dipartimento di Informatica e Comunicazione Università.
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Le funzioni.
ALBERI SLD esercizi. Compito 14 Gennaio 2003 Si consideri il seguente programma Prolog, che calcola il minimo di una lista: min(A,B,A) :- A < B, !. min(A,B,B).
LETTERE MAIUSCOLE. E' molto importante tenere a mente che javascript compie una netta distinzione tra lettere maiuscole e minuscole.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
DEFINIZIONE. La potenza di un numero è il prodotto di tanti fattori uguali a quel numero detto base, quanti ne indica l’esponente. La potenza di un numero.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Psicometria modulo 1 Scienze tecniche e psicologiche Prof. Carlo Fantoni Dipartimento di Scienze della Vita Università di Trieste Campionamento.
Transcript della presentazione:

Esecuzione dei programmi Prolog Liste ed operatori aritmetici Fabio Massimo Zanzotto

Algoritmo di Risoluzione ?- path(a,d). … by examples edge(a,b). edge(b,c). edge(a,e). edge(c,d). edge(d,e). edge(f,e). path(X,Y):- edge(X,Y). path(X,Y):- path(X,Z),path(Z,Y). edge(a,d). path(a,Z),path(Z,d). edge(a,Z),path(Z,d). fail edge(a,b),path(b,d). edge(a,b),path(b,Z),path(Z,d). edge(a,b),edge(b,c),path(c,d). edge(a,b),edge(b,c),edge(c,d). Success! X=a,Y=d X=a,Y=d

Esecuzione programma Analizza i fatti/regole dall’alto verso il basso (quindi è importante l’ordine con cui vengono scritti) Utilizzo del BACKTRACKING per tornare indietro a prima che una variabile fosse unificata o che una certa regola fosse esplorata Utilizzo della ricorsione per chiamare le altre regole Per avere altre risposte, e quindi forzare il backtracking anche se il programma ne ha già trovata una che funziona, basta premere ;

«Letture» dei programmi Prolog Il mondo dei se può essere letto in maniera: Dichiarativa I problemi sono risolubili attraverso la scrittura di un insieme di regole Procedurale I problemi sono risolubili attraverso la scrittura sequenze di istruzioni

«Lettura» Dichiarativa del Prolog È la lettura classica (e più corretta): Una clausola con variabili come grandparent(X,Y):- parent(X,Z), parent(Z,Y). viene letta: Per ogni X e Y e Z, grandparent(X,Y) è vero se parent(X,Z) è vero e parent(Z,Y) è vero

«Lettura» Dichiarativa del Prolog È la lettura classica (e più corretta): Una query come: ?- grandparent(X,mario). viene letta come: esiste un X che tale che grandparent(X,mario) è vero?

«Lettura» Procedurale del Prolog È una lettura necessaria: Una clausola con variabili come grandparent(X,Y):- parent(X,Z), parent(Z,Y). Può essere anche letta: Per qualsiasi valore delle variabili X e Y e Z, per soddisfare il goal grandparent(X,Y) soddisfa prima il goal parent(X,Z) e poi il parent(Z,Y). ATTENZIONE: le variabili NON variano valore durante il soddisfamento del goal

«Lettura» Procedurale del Prolog È una lettura necessaria: Una query come: ?- grandparent(X,mario). viene letta come: Soddisfare il goal grandparent(X,mario) trovando il valore della variabile X?

Osservazioni Importanza dell’ordine delle clausole e nelle clausole. path(X,Y):- path(X,Z),path(Z,Y). path(X,Y):- edge(X,Y). Genera un loop infinito!!!

Liste In Prolog le liste sono molto utilizzate Lista: sequenza di vari elementi (anche ripetuti), che possono essere a loro volta delle liste Es: [primo, secondo, [primo2, secondo2]]. Lista composta da tre elementi Il terzo elemento è a sa volta una lista La lista può essere vuota (caso molto importante e utilizzato)

Liste Ogni lista è composta da due parti: Head: è il primo elemento Tail: è il resto della lista (a sua volta una lista) Le liste possono essere rappresentati in due modi: [a,b,c,d] .(a, .(b, .(c, .(d, []))))

Liste Per estrarre la Testa di una lista si usa la notazione: [H | T ], dove H è la testa e T è la lista rimanente senza il primo elemento Si possono estrarre più elementi contemporaneamente: [H1, H2 | T] H1 e H2 sono il primo e il secondo elemento T è la lista rimanente (la lista di partenza meno i primi due elementi)

Operatori su liste member(?Elem, ?List) Restituisce true se Elem si trova nella lista, può essere usato in vari modi: member(b, [a, b, c, d]). -> true member(e, [a, b, c, d]). -> false member(X,[a, b, c, d]). -> X = a ; X=b ; … member(c, [a, b, X, d]). -> X = c

Operatori su liste member(?Elem, ?List) possibile implementazione: member2(X, [X|_]). member2(X,[_|T]):- member2(X,T).

Operatori su liste append(?List1, ?List2, ?List1AndList2) List1AndList2 è la concatenazione di List1 e List2. Vari utilizzi append([a,b],[c,d], X). -> X = [a,b,c,d] append([a,b],X, [a,b,c,d]). -> X = [c,d] append([a,b],[X,d], [a,b,c,d]). -> X = c append(X, Y, [a,b,c,d]).

Esercizio Scrivere una possibile implementazione della append Scrivere la regola per invertire tutti gli elementi di una lista, in modo da avere: ?- inverti([a,b,c,d,e,f], X). X=[f,e,d,c,b,a]

Operatori In Prolog è possibile definire nuovi operatori, ma ne esistono già alcuni definiti (esempio gli operatori aritmetici) 1*2+3*4 ha i due operatori + e * la scrittura in Prolog sarebbe: +(*(1,2), *(3,4)) + * * 1 2 3 4

Definire un operatore Ogni operatore ha una sua priorità a + b*c come deve essere letto? +(a, *(b,c) ? *( +(a,b), c) ? In matematica * lega di più di +, e quindi + ha priorità più alta di * * + + c a * a b b c

Definire un operatore :- op(Priorità, Tipo, Operatore). Priorità è un numero tra 0 e 1200 Tipo: infisso : xfx, xfy, yfx prefisso: fx, fy postfisso: xf, fy Operatore: il nome/simbolo dell’operatore

Definire un operatore Il tipo serve ad indicare anche la precedenza degli operatori: x : la sua priorità deve essere minore di quella dell’operatore y: la sua priorità deve essere minore o uguale a quella dell’operatore :- op(700, yfx, somma). Qual è l’albero risultante di 9 somma 5 somma 7 ?

Definire un operatore :- op(700, yfx, somma). 9 somma 5 somma 7 Quello a sinistra è corretto, perché? somma somma somma c somma a a b b c

Aritmentica Prolog può essere usato anche per fare dei calcoli, con alcune limitazioni Come detto gli operatori aritmetici sono già definiti A = B + C assegna ad A non il risultato della somma ma assegna proprio B + C per eseguire l’operazione bisogna usare is

Aritmetica A is 5 + 6 fa sì che in A venga messo il valore 11 B is 8 + 2 * 3 mette in B 14 (rispetta la priorità) A destra di is non possono esserci variabile non ancora istanziate

Aritmetica A = 3 , B is A + 4. A = 3, B = A + C. A = 3, B is A+C, C=4. A = 3 e B = 7 A = 3, B = A + C. A = 3 e B = 3+C A = 3, B is A+C, C=4. ERROR: is/2: Arguments are not sufficiently instantiated

Operatori per i calcoli Gli operatori direttamente utilizzabili sono: + - * / ** (elevamento a potenza) // (divisione intera) mod (modulo, resto della divisione) <, >, >=, =<, =, \= (sono confronti booleani utili come predicati, ma non utilizzabili a sinistra di is) number(X) (vero se X è un numero, falso negli altri casi)

Esempio Vedere il file prolog-2.pl per avere un esempio di regole che usano gli operatori per i calcoli calcola(X + Y, Z):- Z is X+Y. calcola(5+8,Y). Y = 13 calcola(5+8+2,X). X = 15

Esercizio Implementare l’operatore div in modo tale che A is 12 div 6 div 2 A = 4 Definire la regola max(A, B, Max) in modo che in Max ci vada il massimo tra A e B Pensare anche al caso: max(A, 5, 9) A = 9.