Scopo: 1. Acquisire conoscenza dell ambiente 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

Note per la Lezione 6 Ugo Vaccaro

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

Laboratorio di Algoritmi e Strutture Dati

Passare argomenti al programma

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

Intelligenza Artificiale I

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

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

13 Esercizi di Riepilogo

Fondamenti di Informatica T-1 Modulo 2

Esercizi su Prolog per Fondamenti di IA 2 Esercitazione

Laboratorio di Informatica

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

TABELLA OPERATORI ARITMETICI

Laboratorio di programmazione

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

COSTRUZIONE DI UN APPLICAZIONE

Funzioni, Stack e Visibilità delle Variabili in C

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

Esercizi proposti 10

Scope, Memoria e Tabella dei Simboli

Laboratorio di Algoritmi e Strutture Dati

Guida all'uso del simulatore Calcolatrice Multibase, versione 1.0

Laboratorio di Python

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

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

Laboratorio con DERIVE

6) Descrivere con un diagramma a blocchi un algoritmo che legga da input due numeri ne calcoli il prodotto in termini di somme ripetute.

Laboratorio 1. 2) All interno della directory c:\temp\cognome\codici creare il file sorgente hello.c contenente il seguente codice:

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

Linguaggi di Programmazione

Introduzione a Visual Studio 2005

Laboratorio di Python

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

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

Algoritmi e Strutture Dati

Esercitazione 1 SQL: DDL e DML di base

ESERCIZI SULLE MATRICI

Corso di Fondamenti di Informatica. La ricorsione

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

Lezione 6 programmazione in Java

Usare il tool emma. info3 angelo unibg

Lezione 3: Programmazione della Shell di Unix

Riprendiamo l esercizio calcolatrice

Esercitazione 11. Liste semplici

4. I moduli in Access 2000/2003

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

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Corso di Informatica di Base

1 Esercizi di Matlab. L operatore : permette di estrarre sottomatrici da una matrice assegnata. Vediamo alcuni esempi.

Fondamenti di Informatica

COSTRUZIONE DI UN APPLICAZIONE

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

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

Le Funzioni e la Ricorsione

Rappresentazione degli algoritmi

Cosa è importante: pom.xml Goal Plug-in Repository

Programmazione di INFORMATICA e Laboratorio

INFORMATICA E PROGRAMMAZIONE PROF. M. GIACOMIN ESPERIENZA IN AULA: ELABORAZIONE DI IMMAGINI A COLORI IN LINGUAGGIO C

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Il Software programmabili programma algoritmo

2 Lavorare con Eclipse

Laboratorio di Python

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

DEBUGGING. Ivan Lanese

C: panoramica. Violetta Lonati

Lab 01 Introduzione a Codelite

suggerisce l uso del formato CSV. La funzionalità può essere implementata sia come

COMANDI ITERATIVI. Ivan Lanese

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

Corso di Laboratorio di Sistemi Operativi

Strutture di controllo iterative

Concetti base. Java - package 2

perror: individuare l errore quando una system call restituisce -1

Le basi del linguaggio Java

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:

Esercizi su strutture dati

Introduzione all ambiente MATLAB. Richiami II. Calcolo Numerico - A.A. 2008/09

Introduzione al software R

Esempio: quanto mi piace questo corso! qufuafantofo mifi pifiafacefe qufuefestofo coforsofo!

Programmazione visuale

AUTOMA A STATI FINITI

Introduzione alla Programmazione Logica ed al linguaggio PROLOG

Informatica B

Introduzione al C++ (continua)

Strutture dati nel supporto a run time

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

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Sistema Operativo (Software di base)

Corso sul linguaggio Java

Esempio di Prova Scritta

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione

LABORATORIO DI INFORMATICA ESERCITAZIONE VIII

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Programmazione con Java

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

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO IX.2014

15 Riepilogo di esercizi in MATLAB

Transcript:

Prolog Esercitazione del 24 Aprile 2011 Scopo: 1. Acquisire conoscenza dell ambiente 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

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

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

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

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

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

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 10

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

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 12

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 13

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

Es. vari 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 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 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] 15

Istruzioni su SICStus Dichiarazioni dinamiche Qualora si vogliano utilizzare i predicati assert e retract occorre porre l'attenzione su una particolarità del sistema SICStus: per ottimizzare le prestazioni il sistema compila i programmi (o meglio le basi di conoscenza) che vengono caricate. È quindi evidente il problema che si pone nel tentare di modificare a run-time un insieme di regole e fatti già compilati. Affinchè sia possibile aggiungere o togliere clausole (o fatti) ad una relazione è necessario dichiarare che tale relazione è da ritenersi dinamica, cioè non definita staticamente a priori. Ad esempio, la seguente dichiarazione previene la compilazione delle clausole relative alle relazionimember/2 e empty/1: :- dynamic user: member/2,user : empty/1. Tale dichiarazione va inserita all'inizio del programma Prolog in cui si definiscono le relazioni in oggetto. 16