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

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

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

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

3 #3: 20 10:50:05 MET

Prolog. Istruzioni su SICStus. Esercitazione del 6 Giugno Scopo: Com è organizzata l esercitazione:

Corso di Intelligenza Artificiale. Esercizio 1

Corso di Intelligenza Artificiale

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

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 1 parte (6 CFU)

CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3

FONDAMENTI DI INTELLIGENZA ARTIFICIALE PRIMA PARTE (6 CFU) 9 Dicembre 2010 Tempo a disposizione 2h Risultato 32/32 punti

Laboratorio di INFORMATICA. 15 ottobre 2009

Fondamenti di Informatica T-1

Informatica B. Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti. Prof. Marco Masseroli

Lab 1 Info B. Marco D. Santambrogio Riccardo Cattaneo Ver. aggiornata al 12 O0obre 2013

Guida SWI-Prolog. Installazione. SWI-Prolog può essere scaricato dal sito web:

Lab 1: Marzo 2013

Usare Python in Linux

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

Fondamenti di informatica T-1 (A K) Esercitazione 6: Eclipse

Fondamenti di Informatica

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU) 13 Gennaio 2015 Tempo a disposizione: 2 h Risultato: 32/32 punti

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

FONDAMENTI DI INTELLIGENZA ARTIFICIALE Prof. Paola Mello- 12 Luglio 2018 Tempo a disposizione: 2 h Risultato: 32/32 punti

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

COSTRUZIONE DI UN APPLICAZIONE

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

FONDAMENTI DI INFORMATICA

Stringhe. Walter Didimo

Esame Laboratorio di Programmazione

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

Comandi principali di Linux (1)

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 13 Luglio 2017 Tempo a disposizione: 2 h Risultato: 32/32 punti

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

FONDAMENTI DI INTELLIGENZA ARTIFICIALE Giugno 2018 Tempo a disposizione: 2 h Risultato: 32/32 punti

Laboratorio di programmazione

Lezione 3: Programmazione della Shell di Unix

12 Function Handles e Ricorsione in MATLAB

Corso di Linguaggi di Programmazione

Fondamenti di Informatica AA 2016/2017

Iniziare a programmare in C++

Usare il tool emma. info3 angelo unibg

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

Installazione Java Standard Edition (SDK)

Guida introduttiva su Eclipse. Ing. Marco Dell'Unto

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

Cos'è Linux. Un sistema operativo : un insieme di programmi necessari per il funzionamento del computer e per il funzionamento di altri programmi.

Laboratorio di Informatica L-A 1

COMPITO DI FONDAMENTI DI INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE (v.o.) PARTE I

definire definire una una funzione in termini di se stessa compare una chiamata alla funzione stessa identificare un caso base

03FYZ TECNICHE DI PROGRAMMAZIONE Esercitazione di Laboratorio 03 es.1 23 Marzo 2016

definire definire una una funzione in termini di se stessa compare una chiamata alla funzione stessa identificare un caso base

2 Lavorare con Eclipse

PROGRAMMAZIONE: I sottoprogrammi

Fondamenti di Informatica T-1

Ricorsione. La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa

La Ricorsione. Carla Binucci e Walter Didimo

Istallazione di Java - Uso delle librerie

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi.

COMPITO DI INTELLIGENZA ARTIFICIALE (v.o.) PARTE I FONDAMENTI DI INTELLIGENZA ARTIFICIALE. 29 Marzo 2007 (Tempo a disposizione 2h; su 32 punti)

Note per la Lezione 6 Ugo Vaccaro

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 16 Giugno 2016 Tempo a disposizione: 2 h Risultato: 32/32 punti

Unità E1. Obiettivi. Non solo problemi matematici. Problema. Risoluzione di un problema. I dati

Corso Linux Base. 2. Uso del Sistema

Il predicato! (cut) Problemi di efficienza

Ambienti di Programmazione per il Software di Base

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

Corso di Fondamenti di Informatica. La ricorsione

COSTRUZIONE DI UN APPLICAZIONE

Note ed esercizi aggiuntivi

Il predicato! (cut) Problemi di efficienza. esempio 1. esempio 2

La Shell di Unix. l utente impartisce i comandi al sistema digitandoli ad un apposito prompt;

Lab. di Sistemi Operativi - Esercitazione n 2- - comando di ricerca: grep -

Laboratorio con DERIVE

Introduzione al software R

Strutture lineari in Java

LABORATORIO DI PROGRAMMAZIONE TURNO 3 (SERALE)

Laboratorio di Informatica

Lab 01 Introduzione a Codelite

Introduzione alla programmazione nella shell di Unix 10 Maggio 2005

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 13 Gennaio 2010 Tempo a disposizione 2h Risultato 32/32 punti

Fondamenti di Informatica T-1

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Lab. di Sistemi Operativi - Esercitazione n 1 - a.a. 2016/2017. Comandi Shell

Lab. di Sistemi Operativi - Esercitazione n 3 - a.a. 2016/2017. Script shell

Esercitazione 1 la shell

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 12 Gennaio 2017 Tempo a disposizione: 2 h Risultato: 32/32 punti

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 2 Aprile 2009 Tempo a disposizione 2h Risultato 32/32 punti

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

MatLab - Testo pagina 1 di 5 101

Considerazioni su Tipi di Dati

ELABORAZIONE DELLE INFORMAZIONI (ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE)

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

Introduzione a Linux Lezione 7 Programmare in Linux

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 1 parte (6 CFU)

Transcript:

Prolog Scopo: 1. Acquisire conoscenza dell ambiente TuProlog/SWI Prolog 2. Risolvere alcuni problemi mediante il linguaggio Prolog Prendere dimestichezza con un approccio DICHIARATIVO Ricorsione e ricorsione tail Liste Cut 1

Istruzioni su SWI Avvio di SWI Prolog L interprete può essere avviato direttamente dal menù Avvio di Windows. All'avvio il sistema si identifica e presenta il proprio prompt, con un output del tipo:?- Directory di lavoro corrente SWI parte facendo direttamente riferimento ad una directory di lavoro corrente. Per sapere qual è, si possono usare i comandi: pwd. working_directory(old, Old). Nota: Old scritto con la maiuscola è una variabile! 2

Istruzioni su SWI Per cambiare directory di lavoro working_directory(_, New). Dove al posto di New dovete mettere la directory desiderata. Ad es.: working_directory(_,'d:/fchesani'). Caricamento di programmi I programmi Prolog possono essere caricati o tramite il menù File consult, o mediante il predicato consult direttamente al prompt:?- consult(flatten). % flatten compiled 0.00 sec, 1,492 bytes true.?- (si noti che non è necessario specificare l estensione del file: SWI cerca automaticamente file con estensione.pl ) 3

Istruzioni su SWI Tracing Il comando trace consente di seguire passo passo la risoluzione delle clausole; tale modalità può poi essere disabilitata con il comando notrace. Per eseguire il trace (debug) di una query, è necessario invocare il predicato trace, seguito subito dopo dal goal che si vuole verificare. Ad esempio:?- trace, p(x). Permette di eseguire passo passo la risoluzione della query p(x). 4

SWI versione online E' disponibile anche una versione online dell'interprete SWI: https://swish.swi-prolog.org/ 5

TuProlog (2P) Sviluppato da colleghi del DISI (capo progetto: Prof. Enrico Denti) Sito principale: http://apice.unibo.it/xwiki/bin/view/tuprolog/ Link per il download (per questa esercitazione): https://bitbucket.org/tuprologteam/tuprolog/downloads Caratteristiche: Pure Java Dispone di una interfaccia grafica oggi useremo quest ultima eseguibile : 2p.jar Disponibile anche per Android,.NET, e come plugin per ambiente Eclipse Home page: http://apice.unibo.it/xwiki/bin/view/tuprolog/ 6

TuProlog (2P) Editor del programma prolog Query Soluzioni, binding delle variabili, etc. Altre soluzioni 7

TuProlog (2P) Alcune osservazioni: Alcuni predicati classici sono già definiti, e non necessitano di essere caricati tramite apposita libreria E.g., member(el, LIST) Non c è il concetto di working directory (come accade invece in altri prolog ) E disponibile una finestra grafica per il debug (miglior supporto disponibile nel plug-in per Eclipse) Necessario salvare i propri programmi in file appositi 8

Es. 1 Si definisca un predicato in PROLOG chiamato maxlist che applicato ad una lista di liste di interi ListListInt dia come risultato la lista degli elementi massimi di ogni lista componente di ListListInt. Si definisca prima la versione ricorsiva e poi quella ricorsiva-tail. Esempio:?-?- maxlist([[3,10,2], [6,9],[1,2]], X). yes, X = [10,9,2] 9

Es. 1 - Soluzione maxlist([],[]). maxlist([x Y],[N T]):- max(x,n),maxlist(y,t). Versione ricorsiva: max([x],x):-!. max([x T],X):- max(t,n),x>=n,!. max([x T],N):- max(t,n). 10

Es. 1 - Soluzione maxlist([],[]). maxlist([x Y],[N T]):- max(x,n),maxlist(y,t). Versione ricorsiva: max([x],x):-!. max([x T],X):- max(t,n),x>=n,!. max([x T],N):- max(t,n). Versione iterativa: max([x T],M):- max(t,x,m). max([],m,m):-!. max([h T],MT,M):- H>MT,!, max(t,h,m). max([h T],MT,M):- max(t,mt,m). 11

Es.1 Uso del! Il! deve essere usato con scrupolosa attenzione Consideriamo il programma Prolog max([x],x):-!. max([x T],X):- max(t,n),x>=n,!. max([x T],N):- max(t,n). Il programma funziona correttamente quando invocato con secondo parametro (ovvero il massimo) VARIABILE Es.: max([1,2,4,3],m) Il programma NON funziona correttamente quando invocato per testare se un certo valore è il massimo In particolare, poiché la terza clausola non contiene la condizionex<n, il programma restituisce true Sia mettendo il valore massimo, es. max([1,2,4,3],4) Sia mettendo l ultimo valore contenuto nella lista, es. max([1,2,4,3],3) Si provino a disegnare gli alberi SLD per vedere cosa accade! 12

Es. 2 Data una lista L1 e un numero intero N, scrivere un predicato Prolog domanda1(l1,n,l2) che restituisca in L2 la lista degli elementi di L1 che sono liste contenenti solo due valori interi positivi fra 1 e 9 la cui somma valga N. Esempio: :- domanda1( [ [3,1], 5, [2,1,1], [3], [1,1,1], a,[2,2] ], 4, L2). yes, L2 = [[3,1], [2,2]] 13

Es. 2 - Soluzione domanda1([],_,[]). domanda1([[a,b] R ], N, [[A,B] S]):- A>=1, A=<9, B>=1, B=<9, N is A + B,!, domanda1( R,N,S ). domanda1([_ R], N,S ):- domanda1( R,N,S ). 14

Es. 3 Si scriva un predicato Prolog che data una lista ed un elemento El appartenente alla lista, restituisca in uscita l'elemento successivo ad El nella lista. Esempio:?- consec(3, [1,7,3,9,11],X). yes X=9 Nel caso in cui El sia l'ultimo elemento il predicato dovrà fallire 15

Es. 3 - Soluzione consec(el, [El [X _]],X):-!. consec(el, [_ Tail],X):- consec(el,tail,x). 16

Es. 4 tratto dal Compito del 29 marzo 2006 Un giorno il mago rosso venne sfidato dal mago verde ad un duello di veleni. Ciascuno dei due doveva portare il veleno più potente che era riuscito a produrre; ciascuno avrebbe bevuto prima il veleno dell altro e poi il proprio. Vale infatti la regola che se si beve un veleno e poi uno più potente, allora non si muore, ma il secondo fa da antidoto per il primo. Il mago rosso accettò la sfida, sapendo che il mago verde aveva un veleno molto più potente del suo: quello del mago verde ha potenza 8, mentre il mago rosso ha solo dell acqua (che non è un veleno e ha potenza 0) ed un veleno a potenza 1. Il mago rosso, però ha pensato di bere qualcosa prima della sfida 17

Es. 4 tratto dal Compito del 29 marzo 2006 Si scriva un predicato Prolog vivo/1 che prende in ingresso una lista di numeri ed ha successo se bevendo quella sequenza di veleni si sopravvive. Es:?- vivo([1,8,0,1,4]). yes?- vivo([1,2,4,1]). no 18

Es. 4 Soluzione vivo([]). vivo([0 L]):-!, vivo(l). vivo([a,b L]):- A < B, vivo(l). 19

Es. vari 5. Scrivere un predicato flatten che appiattisce una lista di liste. Ad esempio: :- flatten([ 1,a,[2,3],[],h,f(3),[c,[d,[e]]] ],L). yes, L=[1,a,2,3,h,f(3),c,d,e] Suggerimento: cercare di riformulare il problema in maniera dichiarativa. Nella formulazione, assumere che l appiattimento di un elemento è una lista contenente quell elemento 6. Data una matrice NxN rappresentata come lista di liste, si calcoli la somma degli elementi della diagonale principale. Provare a ragionare in termini di sottomatrici 7. Si definisca un predicato Prolog che calcola i massimi locali (esclusi gli estremi) di una lista, ad esempio: :- max_loc([5,4,7,2,3,6,1,2],x) yes, X=[7,6] 20

Es. 8 posizione in una lista Si scriva un predicato Prolog : listpos(l, El, Pos) che ricevuta in ingresso una lista L, restituisce la posizione Pos dell'elemento El specificato. Le posizioni si contano a partire da zero. Ad esempio:?- listpos([1,2,3,5,6,3], 3, X). yes. X / 2 Solution: listpos([1,2,3,5,6,3],3,2) 21

Es. 8 posizione in una lista listpos([x _], X, 0). listpos([_ T], X, Pos) :- listpos(t, X, Pos1), Pos is Pos1+1. Questa funzione è ricorsiva tail? 22

Es. 8 posizione in una lista Ricorsiva tail: %%% listpos/3 listpos(l, El, Pos) :- listpos(l, El, Pos, 0). %%% listpos/4 %%% listpos(list, El, Pos, Part) listpos([el _], El, Pos, Pos). listpos([_ T], El, Pos, Part) :- Part1 is Part + 1, listpos(t, El, Pos, Part1). 23

Compito del 16 Giugno 2016 Si scriva un predicato Prolog : list_int(m,n,l) che genera la lista L di tutti i numeri compresi fra M e N. Se M > N genera la lista vuota. Ad esempio:?- list_int(3,5,l). L= [3,4,5] 24

Compito del 16 Giugno 2016 - Soluzione list_int(m,n,[]) :- M > N. list_int(m,n,[m Tail]) :- M =< N, M1 is M+1, list_int(m1,n,tail). Questa funzione è ricorsiva tail? 25

Compito del 8 Settembre 2016 Si scriva un predicato Prolog remove_list( L1, L2, L3) che data una lista L1 e una lista L2 restituisca una lista L3 contenente gli elementi di L1 non contenuti in L2. Esempi:?- remove_list([a,b,a,b,b,c], [a,c], L). L=[b,b,b].?- remove_list([a,b], [], L). L=[a,b]. Si definiscano tutti i predicati utilizzati. 26

Compito del 8 Settembre 2016 - Soluzione remove_list( [], _, []) :-!. remove_list( [H D], L2, R) :- member(h, L2),!, remove_list(d, L2, R). remove_list( [H D], L2, [H R]) :- remove_list(d, L2, R). member( X, [X _]) :-!. member( X, [_ D]) :- member(x,d). Questa funzione è ricorsiva tail? 27