Le liste sono una delle strutture dati primitive più diffuse nei linguaggi di programmazione per l'elaborazione simbolica (es(

Documenti analoghi
può essere rappresentata anche come

Esercizi su Prolog per Fondamenti di IA 2 Esercitazione

Esercizi prolog. Si consiglia di utilizzare inoltre i libri consigliati e gli esercizi contenuti nel zip file fornito dal docente

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

TABELLA OPERATORI ARITMETICI

In Prolog una lista è rappresentata con un termine così definito:

Corso di Fondamenti di Informatica. La ricorsione

PUNTATORI A STRUTTURE

La programmazione nel linguaggio C

Esercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012

Corso di Programmazione Problem Solving. Tipi di Problemi. Problemi Complessi Soluzione. Dott. Pasquale Lops. Primitivi. Complessi

1. Acquisire conoscenza dell ambiente TuProlog/SWI Prolog 2. Risolvere alcuni problemi mediante il linguaggio Prolog

Esempio: rappresentare gli insiemi

Y1-Y= Y=\=Xdist, =Xdist,

N-Regine POSSIBILE SOLUZIONE IN PROLOG: GENERATE AND TEST

In Prolog predicati (programmi) e termini (dati) hanno la stessa struttura e possono essere utilizzati in modo interscambiabile

Esercizi di LISP. Marco Broglia. 09 novembre 2005

In Prolog predicati (programmi) e termini (dati) hanno la stessa struttura e possono essere utilizzati in modo interscambiabile

Scopo: 1. Acquisire conoscenza dell ambiente SWI Prolog 2. Risolvere alcuni problemi mediante il linguaggio Prolog

6) Tradurre la definizione ottenuta nel punto 1 in Lisp e calcolare degli esempi sul computer.

Laboratorio di Python

Esempio di Prova Scritta

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

L ambiente UNIX/Linux. I filtri Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Fondamenti di Informatica T-1 Modulo 2

Una libreria di funzioni per la geometria analitica

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Esercizi su strutture dati

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

S::= Aa bb bc A::= 1B 0 B::= 0A 1 C::= Cc d Si scriva un riconoscitore in Prolog del linguaggio generato da G. Suggerimento: si elimini la ricorsione

Insiemi Specifiche, rappresentazione e confronto tra realizzazioni alternative.

PROGRAMMAZIONE STRUTTURATA

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Algoritmi

Algoritmi e Strutture Dati

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Strutture Dinamiche. Fondamenti di Informatica

Strutture dati dinamiche in C (II)

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

IL LINGUAGGIO LISP. Marco Broglia

Programmazione I - Laboratorio

Forma Normale di Chomsky

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Prima lezione. Le funzioni (subroutines)

Prolog, Alberi SLD e SLDNF. Scopo: 1. Semplici esercizi sul Prolog 2. Esercizi su alberi di risoluzione SLD e SLDNF

Programmazione Ricorsione in coda

Fondamenti di Intelligenza Artificiale M

Ripasso di teoria ed esercizi in preparazione al terzo compito. 26 gennaio 2004

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

COMPITO DI INTELLIGENZA ARTIFICIALE, Fondamenti di Intelligenza Artificiale e Intelligenza Artificiale Modulo A 16 Dicembre 2005 Tempo 2,30 ore

Prima prova intercorso 29 Novembre 2005

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Laboratorio di Programmazione

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 14 Gennaio 2016 Tempo a disposizione: 2 h Risultato: 32/32 punti

Liste. Università degli Studi di Milano

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

3.3 FORMULAZIONE DEL MODELLO E CONDIZIONI DI

COMPITO DI FONDAMENTI DI INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE (v.o.) PARTE I. 25 Giugno 2008 (Tempo a disposizione 2h ; su 32 punti)

Strutture dati in PROLOG. Lezione 6. Intelligenza Artificiale Daniele Nardi, 2003 Lezione 6 0

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Structured Query Language

Strutture dati. Le liste

Programmazione Funzionale

Parte n.4 Linguaggi: Gerarchia ed Operazioni

Definizione FONDAMENTI DI INFORMATICA. Esempio di algoritmo: determinare il maggiore di due numeri interi x, y. Proprietà degli algoritmi

1) METODO DELLE SEZIONI DI RITTER

Forme Normali. Forma normale di Chomsky. E caratterizzata da regole di due tipi. A! BC dove A, B, C $ V N A! a con a $ V T. Forma normale di Greibach

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Quiz sui linguaggi regolari

Programmazione logica e PROLOG. Esercitazione 1. AI - Carlucci Aiello & Nardi, 2007 Esercitazione 1 0

Iterazione (introduzione)

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Pile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

Algebra di Boole X Y Z V. Algebra di Boole

Gestione avanzata dei file

PILE E CODE. Pile (stack):

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

TABELLE AD INDIRIZZAMENTO DIRETTO

Espressioni aritmetiche

Il Linguaggio Prolog. Il Prolog è un linguaggio dichiarativo

Note per la Lezione 6 Ugo Vaccaro

La classe string. Tale classe evita agli utilizzatori tutte le problematiche di allocazione e de-allocazione dei buffer di caratteri

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 8 Settembre 2016 Tempo a disposizione: 2 h Risultato: 32/32 punti

Programmazione Dichiarativa. Programmazione Logica. SICStus PROLOG PROLOG. Bob Kowalski: "Algoritmo = Logica + Controllo"

Calcolatori Elettronici

Rappresentazione di liste mediante puntatori in linguaggio C

Algebra di Boole Algebra di Boole

Capitolo 19. Ricorsione

Brevissima introduzione al Lisp

Corso di Geometria BIAR, BSIR Esercizi 2: soluzioni

Automi Automi finiti: macchine a stati su sistemi di transizioni finiti Modellare con TS e specificare con automi: si usa lo stesso tipo di

Transcript:

LISTE Le liste so una delle strutture dati primitive più diffuse nei linguaggi di programmazione per l'elaborazione simbolica (es( es: Lisp) In Prolog le liste so dei termini costruiti a partire da u speciale atomo (che deta la lista vuota) e utilizzando un particolare operatore o funzionale (l'operatore. ). La definizione di lista può essere data ricorsivamente nel modo seguente: l atomo [] rappresenta la lista vuota il termine.(t,lista) è una lista se T è un termine qualsiasi e Lista una Lista. T prende il me di TESTA della lista e Lista di CODA 1 LISTE: ESEMPI I seguenti termini Prolog so liste: (1) [] (2).(a, []) (3).(a,.(b,[])) (4).(f(g(X)),. (h(z),.(c, []))) (5).([], []) (6).(.(a,[]),.(b, []))) Il Prolog fornisce una tazione semplificata per la rappresentazione delle liste: la lista.(t,lista) può essere rappresentata anche come [T LISTA] Tale rappresentazione può essere paragonata all'applicazione della funzione "cons" cons" " del Lisp.. La testa (head( head) ) T e la coda (tail( tail) LISTA della lista n so altro che i risultati dell'applicazione delle funzioni Lisp "car"" e "cdr" cdr" " alla lista stessa. 2

LISTE: ESEMPI Le liste nell'esempio precedente posso essere rappresentate nel modo seguente: (1) [] (2) [a []] (3) [a [b []]] (4) [f(g(x)) [h(z) [c []]]] (5) [[] []] (6) [[a []] [b []]] Ulteriore semplificazione; la lista [a [b [c]]] può essere rappresentata nel modo seguente: [a, b, c] 3 LISTE: ESEMPI Le liste nell'esempio precedente posso essere rappresentate nel modo seguente: (1) [] (2) [a] (3) [a,b] (4) [f(g(x)),h(z),c] (5) [[]] (6) [[a],b] Ulteriore semplificazione; la lista [a [b [c]]] può essere rappresentata nel modo seguente: [a, b, c] 4

UNIFICAZIONE SULLE LISTE L'unificazione (combinata con le varie tazioni per le liste) è un potente meccanismo per l'accesso alle liste p([1,2,3,4,5,6,7,8,9]). :-p(x). X=[1,2,3,4,5,6,7,8,9] :- p([x Y]). X=1 Y=[2,3,4,5,6,7,8,9] :- p([x,y Z]). X=1 Y=2 Z=[3,4,5,6,7,8,9] :- p([_ X]). X=[2,3,4,5,6,7,8,9] 5 OPERAZIONI SULLE LISTE Le procedure che opera su liste so definite come procedure ricorsive basate sulla definizione ricorsiva di lista Verificare se un termine è una lista is_list list(t) = true se T è una lista false se T n è una lista is_list list([]). is_list list([x L]) :-: is_list list(l). :- is_list list([1,2,3]). :- is_list list([a b]). 6

OPERAZIONI SULLE LISTE Verificare se un termine appartiene ad una lista member(t,l) "T è un elemento della lista L member(t, [T _]). member(t, [_ L]) :-: :- member(2, [1,2,3]). :- member(1, [2,3]). :- member(x, [1,2,3]). X=1; X=2; X=3; member(t, L). La relazione member può quindi essere utilizzata in più di un modo (per la verifica di appartenenza di un elemento ad una lista o per individuare gli elementi di una lista). 7 OPERAZIONI SULLE LISTE Determinare la lunghezza di una lista length(l,n) la lista L ha N elementi lenght([],0). length([_ L],N) :-: length(l,n1), N is N1 + 1. Versione ricorsiva length1(l,n) :-: length1(l, 0, N). lenght1([], ACC, ACC). length1([_ L],ACC,N):- ACC1 is ACC+1, length1(l, ACC1, N). Versione iterativa 8

OPERAZIONI SULLE LISTE Concatenazione di due liste append(l1,l2,l3) L3 e il risultato della concatenazione di L1 e L2 append([],l,l). append([h T],L2,[H T1]): ([H T],L2,[H T1]):- append(t,l2,t1). :- append([1,2],[3,4,5],l). L = [1,2,3,4,5] :- append([1,2],l2,[1,2,4,5]). L2 = [4,5] :- append([1,3],[2,4],[1,2,3,4]). 9 ESEMPIO Evoluzione della computazione in seguito alla valutazione del goal :-append([1,2],[3,4,5],l). H T L2 1 2 3 4 5 H T1 dove append([2],[3,4,5],t1) 1 Viene generato il sottogoal :- append([2],[3,4,5],t1) H T =[] L2 2 3 4 5 H T1 dove append([],[3,4,5],t1 ) 2 T1 10

ESEMPIO Viene generato il sottogoal :- append([],[3,4,5],t1 ) Utilizzando la prima clausola si ha che T1 = [3,4,5] H T1 1 [1,2,3,4,5] 2 T1 3 4 5 11 ESEMPI :- append(l1, L2, [a,b,c,d]). L1=[] L2=[a,b,c,d]; L1=[a] L2=[b,c,d]; L1=[a,b] L2=[c,d]; L1=[a,b,c] L2=[d]; L1=[a,b,c,d] L2=[] :- append(l1, [c,d], L). L1=[] L=[c,d]; L1=[_1] L=[_1,c,d]; L2=[_1,_2] L=[_1,_2,c,d]; (infinite soluzioni) :- append([a,b], L1, L). L1=_1 L=[a,b _1] :- append(l1, L2, L3). L1=[] L2=_1 L3=_1; L1=[_1] L2=_2, L3=[_1 _2]; L1=[_1,_2] L2=_3 L3=[_1,_2 _3] (infinite soluzioni) 12

OPERAZIONI SULLE LISTE Cancellazione di u o più elementi dalla lista delete1(el El,L,L1) la lista L1 contiene gli elementi di L tranne il primo termine unificabile con El delete1(el El,[],[]). delete1(el El,[,[El T],T). delete1(el El,[H T],[H T1]):,[H T],[H T1]):- delete1(el El,T,T1). delete(el El,L,L1) la lista L1 contiene gli elementi di L tranne tutti i termini unificabili con El delete(el El,[],[]). delete(el El,[,[El T],T1): T],T1):- delete(el El,T,T1). delete(el El,[H T],[H T1]):,[H T],[H T1]):- delete(el El,T,T1). 13 ATTENZIONE!! Le due procedure delete e delete1 fornisco una sola risposta corretta ma n so corrette in fase di backtracking. :- delete(a,[a,b,a,c],l). L=[b,c]; L=[b,a,c]; L=[a,b,c]; L=[a,b,a,c]; Unica soluzione corretta!! Il problema è legato alla mutua esclusione tra la seconda e la terza t clausola della relazione delete Se T appartiene alla lista (per cui la seconda clausola di delete ha successo), allora la terza clausola n deve essere considerata una alternativa valida. Questo problema verra risolto dal CUT 14

OPERAZIONI SULLE LISTE Inversione di una lista reverse(l,lr) la lista Lr contiene gli elementi di L in ordine inverso reverse([],[]). reverse([h T],Lr): ([H T],Lr):- reverse(t,t2), append(t2,[h],lr). :- reverse([],[]). :- reverse([1,2],lr). Lr = [2,1] 15 ESEMPIO Evoluzione della computazione in seguito alla valutazione del goal :-reverse([1,2,3], Lr). :-reverse([1,2,3], Lr) H=1, T=[2,3] :-reverse([2,3], L1),append(L1,[1],Lr) H=2, T=[3] :-reverse([3], L2),append(L2,[2],L1), append(l1,[1],lr) H=3, T=[] :-reverse([],l3),append(l3,[3],l2),append(l2,[2],l1),append(l1,[1],lr) L3=[] :-append([],[3],l2),append(l2,[2],l1),append(l1,[1],lr) L2=[3] :-append([3],[2],l1),append(l1,[1],lr) L1=[3,2] :-append([3,2],[1],lr) Lr=[3,2,1] 16

OPERAZIONI SULLE LISTE Inversione di una lista (Versione iterativa) reverse1(l,lr) la lista Lr contiene gli elementi di L in ordine inverso reverse1(l,lr) :-: reverse1(l,[],lr). reverse1([], ACC, ACC). reverse1([h T],ACC,Y):- reverse1(t,[h ACC],Y). Potevamo usare la append La lista L da invertire viene diminuita ad ogni passo di un elemento ento e tale elemento viene accumulato in una nuova lista (in testa) Un elemento viene accumulato davanti all'elemento che lo precedeva nella lista originaria, ottenendo in questo modo l'inversione. Quando la prima lista è vuota, l'accumulatore contiene la lista invertita 17 OPERAZIONI SUGLI INSIEMI Gli insiemi posso essere rappresentati come liste di oggetti (senza( ripetizioni) Intersezione di due insiemi intersection(s1,s2,s3) l insieme S3 contiene gli elementi appartenenti all intersezione di S1 e S2 intersection([],s2,[]). intersection([h T],S2,[H T3]): ([H T],S2,[H T3]):- member(h,s2), intersection(t,s2,t3). intersection([h T],S2,S3): ([H T],S2,S3):- intersection(t,s2,s3). :- intersection([a,b], [b,c], S). S=[b] :- intersection([a,b,c,d],s2,[a,c]). S2=[a,c _1] 18

ESEMPIO :- intersection(s1,s2,[a,c]). S1=[a,c] S1=[a,c,_2] S2=[a,c _1]; S2=[a,c _1]; S1=[a,c,_2,_3] S2=[a,c _1];... (infinite soluzioni)... :- intersection([a,b,c],[b,c,d],s3). S3=[b,c]; S3=[b]; S3=[c]; S3=[]; Unica soluzione corretta!! Problema della mutua esclusione tra clausole 19 OPERAZIONI SUGLI INSIEMI Unione di due insiemi union(s1,s2,s3) l insieme S3 contiene gli elementi appartenenti all unione di S1 e S2 union([], S2, S2). union([x REST],S2,S):- member(x, S2), union(rest, S2, S). union([x REST],S2,[X S]):- union(rest, S2, S). Anche il predicato union in backtracking ha un comportamento scorretto. Infatti, anche in questo caso n c e mutua esclusione tra la seconda e la terza clausola. 20

ESERCIZI PROPOSTI Programma Prolog per determinare l'ultimo elemento di una lista. Programma Prolog che, date due liste L1 e L2, verifica se L1 è una sottolista di L2. Programma Prolog per verificare se una lista è palindroma, ossia uguale alla sua inversa. Programma Prolog che elimina da una lista tutti gli elementi ripetuti. Programma Prolog che, dati un termine T e una lista L, conta le occorrenze di T in L. Programma Prolog per appiattire una lista (multipla). Ad esempio l'appiattimento della lista [1,[2,3,[4]],5,[6]] deve produrre la lista [1,2,3,4,5,6]. Programma Prolog per effettuare l'ordinamento (sort( sort) ) di una lista. Ad esempio, si realizza algoritmi di ordinamento quali l'ordinamento nto per inserzione,, il "bubblesort" bubblesort", il "quicksort" quicksort". 21