1 / 27

Controllare Tipi Dati Decomporre fatti Controllare il database

Controllare Tipi Dati Decomporre fatti Controllare il database. Fabio Massimo Zanzotto ( slides di Andrea Turbati). Fatti sul Prolog. Linguaggio dichiarativo Non ha definizioni di tipi Non è possibile definire una specifica dei predicati. Occorrono . Predicati per controllare i tipi.

flo
Download Presentation

Controllare Tipi Dati Decomporre fatti Controllare il database

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Controllare Tipi DatiDecomporre fattiControllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)

  2. Fatti sul Prolog Linguaggio dichiarativo Non ha definizioni di tipi Non è possibile definire una specifica dei predicati Occorrono Predicati per controllare i tipi

  3. Controllare i termini • Il Prolog fornisce dei predicati per avere informazioni sui termini: • var(X). • nonvar(X). • atom(X). • integer(X). • float(X). • number(X). • atomic(X). vero sia per atomi che per numeri • compound(X).

  4. Esempio di uso Definire la clausola /*count(X,L,NUM_VOLTE)*/ vera X è un atomo, L è una lista, e NUM_VOLTE è il numero di volte per cui C appare in L.

  5. Count: versione 0 count(_,[],0). count(A,[A|L],N):- count(A,L,N1), N is N1 + 1. count(A,[B|L],N):- A \= B, count(A,L,N).

  6. Count: versione 1 count(_, [], 0). count(A, [A|L], N):- !, count(A, L, N1), N is N1 + 1. count(A, [_|L], N):- count(A,L,N).

  7. Count: versione 0 e 1 • ?- count(a, [a,b,a,a],N). • N = 3 • ?- count(a, [a,b,X,Y], N). • X=aY=a N=3 • ?- L=[a,b,X,Y], count(a, L,Na), count(b,L,Nb). • X=a Y=a Na=3 Nb=1

  8. Count: versione 2 count2(_, [], 0). count2(A, [B|L], N):- atom(B), A=B, !, count2(A, L, N1), N is N1 + 1. count2(A, [_|L], N):- count2(A,L,N).

  9. Count: versione 2 • ?- count2(a, [a,b,a,a],N). • N = 3 • ?- count2(a, [a,b,X,Y], N). • N=1 • ?- L=[a,b,X,Y], count2(a, L,Na), count2(b,L,Nb). • Na=1 Nb=1

  10. SEGNO

  11. Fatti sul prolog Non controllo sui tipi e sulle definizione dei predicati Quindi, i termini e i predicati possono essere decomposti in liste.

  12. Costruire e decomporre i termini • Prolog permette di scomporre un termine complesso (struttura dati) in una lista formata dal funtore e dai suoi argomenti. • I tre predicati che permettono ciò sono: • =.. • functor • arg

  13. =.. • Si legge univ • Viene usato come un operatore infisso • ?Term =.. ?List • f(a,b) =.. [f,a,b] • ?- member(a,[a,b,c]) =.. List . • List=[member, a, [a,b,c]] • ?- T =.. [rectangle,3,5]. • T = rectangle(3,5)

  14. functor • Restituisce il funtore di un termine complesso • functor(?Term, ?Name, ?Arity) • ?- functor(t(f(X), Y, a), Fun, Arity ). • Fun = t Arity = 3

  15. Esercizio: realizzare functor

  16. arg • Restituisce l’argomento che si trova in una data posizione (a partire da 1) di un termine complesso • arg(?Arg, +Term, ?Value) • ?- arg(1, t(f(X), Y, a), Value). • Arg = f(X)

  17. Esercizio: realizzare arg

  18. Esempio functor e arg • ?- functor(D, date, 3), arg(1, D, 15), arg(2, D, july), arg(3, D, 1950). • D= date(15, july, 1950).

  19. Fatti sul prolog Il principio fondamentale per il funzionamento è l’unificazione Ma esistono operatori binari?

  20. Operatori di confronto • In Prolog esistono vari operatori per il confronto • = • is • =:= confronto espressioni aritmetiche uguali • =\= confronto espressioni aritmetiche diverse • == uguaglianza, ma non assegnazione • \== disuguaglianza • @< ordinamento lessicografico

  21. Operatori di confronto • Sono realizzabili attraverso dei predicati?

  22. Richiamo Un programma prolog è un: • Insieme di regole e di fatti che • Risponde alle query con o true o false e assegna dei valori alle variabili

  23. Controllare la conoscenza del prolog • Prolog permette di aggiungere o rimuovere a runtime fatti e regole • ATTENZIONE: i nuovi fatti vengo aggiunti solo in memoria e non al file che contiene i fatti di partenza • Affinché sia possibile aggiungere un fatto bisogna indicare che questo è “dimamico”: • :-dynamic Fatto/Arity

  24. Aggiunta fatti • Per aggiungere i fatti esistono due predicati: • assertz(+Term) • asserta(+Term) • assertz aggiunge il fatto alla fine del database • asserta aggiunge il fatto all’inizio del database

  25. Rimozione fatti • Per rimuovere i fatti esistono due predicati: • retract(+Term) • retractall(+Head) • retract rimuove il fatti dal databse • retractall rimuove TUTTI i fatti e le regole che hanno la head indicata

  26. Esempio assertz/retract • ?- friend(tom, jerry). • false • ?- assertz(friend(tom, jerry)). • true • ?- friend(tom, jerry). • true • ?-retract(friend(tom, jerry)). • true • ?- friend(tom, jerry). • false

  27. Controlfacilities • Esistono alcune controlfacilities che facilitano la realizzazione dei programmi: • ! (cut) • fail • true • not • call(P) ha successo se il predicato P ha successo • repeat ha sempre successo anche durante il backtracking (utile per i loop)

More Related