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 PRIMA PARTE (6 CFU) 9 Dicembre 2010 Tempo a disposizione 2h Risultato 32/32 punti

CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 1 parte (6 CFU)

Fondamenti di Informatica T-1

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

Fondamenti di Informatica

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

COSTRUZIONE DI UN APPLICAZIONE

Laboratorio di INFORMATICA. 15 ottobre 2009

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

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

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

Laboratorio di programmazione

Usare Python in Linux

12 Function Handles e Ricorsione in MATLAB

Usare il tool emma. info3 angelo unibg

Installazione Java Standard Edition (SDK)

Guida introduttiva su Eclipse. Ing. Marco Dell'Unto

2 Lavorare con Eclipse

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

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

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

PROGRAMMAZIONE: I sottoprogrammi

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

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

Lezione 3: Programmazione della Shell di Unix

FONDAMENTI DI INFORMATICA

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

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

Lab 1: Marzo 2013

Note per la Lezione 6 Ugo Vaccaro

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

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

COSTRUZIONE DI UN APPLICAZIONE

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

Laboratorio di Informatica L-A 1

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

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

Istallazione di Java - Uso delle librerie

Comandi principali di Linux (1)

Esame Laboratorio di Programmazione

Laboratorio di Informatica

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

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

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

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

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

MatLab - Testo pagina 1 di 5 101

Intelligenza Artificiale I

Corso Linux Base. 2. Uso del Sistema

Linguaggi Compilati vs. Interpretati

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

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

Corso di Linguaggi di Programmazione

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

Esercizi su Prolog per Fondamenti di IA 2 Esercitazione

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 1 parte (6 CFU)

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

Stringhe. Walter Didimo

Corso di Fondamenti di Informatica. La ricorsione

Esempio compito 11 Sett 2008

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

TABELLA OPERATORI ARITMETICI

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

Esempio: il fattoriale di un numero fact(n) = n! n!: Z! N n! vale 1 se n " 0 n! vale n*(n-1)! se n > 0. Codifica:

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

L IDE NETBEANS. (slide: A. Baratè) Programmazione per la Musica Adriano Baratè

Fondamenti di Informatica T-1

Linguaggi di Programmazione

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

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

Operativamente, risolvere un problema con un approccio ricorsivo comporta

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti

Strumenti per lo sviluppo e la gestione di Ontologie

Fondamenti di Informatica T-1

Introduzione a Linux Lezione 7 Programmare in Linux

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

Lab 01 Introduzione a Codelite

ELABORAZIONE DELLE INFORMAZIONI (ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE)

Passare argomenti al programma

Iniziare a programmare in C++

Esercitazione 1 SQL: DDL e DML di base

Sistema Operativo (Software di base)

Introduzione al Sistema Operativo MS-Windows ed all Uso dell IDE DEV-C++

Laboratorio di trattamento numerico dei dati sperimentali

Laboratorio di Python

INTRODUZIONE A R. Dott. Giuseppe Sgroi Dipartimento di Matematica e Informatica 29 Maggio 2019

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 e necessario specificare l estensione del file: SICStus 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

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): http://apice.unibo.it/xwiki/bin/view/tuprolog/download 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 5

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

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 7

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] 8

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). 9

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! 10

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]] 11

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 ). 12

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 13

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

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 15

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 16

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

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] 18