1 / 27

Definire operatori Strutture dati

Definire operatori Strutture dati. Fabio Massimo Zanzotto ( slides di Andrea Turbati). Operatori. In Prolog è possibile definire nuovi operatori, ma ne esistono già alcuni definiti (esempio gli operatori aritmetici) 1*2+3*4 ha i due operatori + e * la scrittura in Prolog sarebbe:

vic
Download Presentation

Definire operatori Strutture dati

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. Definire operatoriStrutture dati Fabio Massimo Zanzotto (slides di Andrea Turbati)

  2. Operatori • In Prolog è possibile definire nuovi operatori, ma ne esistono già alcuni definiti (esempio gli operatori aritmetici) • 1*2+3*4 ha i due operatori + e * • la scrittura in Prolog sarebbe: • +(*(1,2), *(3,4)) + * * 4 1 2 3

  3. Definire un operatore • Ogni operatore ha una sua priorità • a + b*c come deve essere letto? • +(a, *(b,c) ? • *( +(a,b), c) ? • Nel senso comune trasmessoci, * lega di più di +, * + + c a * a b c b

  4. Definire un operatore Codificare la priorità: l’albero delle interpretazioni ha priorità decrescenti + ha priorità 500 * ha priorità 400 (e quindi + ha priorità più alta di *) a + b*c * + + c a * a b c b

  5. Definire un operatore • :- op(Priorità, Tipo, Operatore). • Priorità è un numero tra 0 e 1200 • Tipo: • infisso : xfx, xfy, yfx • prefisso: fx, fy • postfisso: xf, fy • Operatore: il nome/simbolo dell’operatore

  6. Definire un operatore • Il tipo serve ad indicare anche la precedenza degli operatori: • x : la sua priorità deve essere minore di quella dell’operatore • y: la sua priorità deve essere minore o uguale a quella dell’operatore • :- op(700, yfx, somma). • Qual è l’albero risultante di • 9 somma 5 somma 7 ?

  7. Definire un operatore • :- op(700, yfx, somma). • 9 somma 5 somma 7 • Quello a sinistra è corretto, perché? somma somma somma somma c a a b c b

  8. Esercizio Studiamo la sintassi della lingua Realizziamo gli operatori «ha» e «di», di modo che con frasi: • mario ha la macchina di dario • giovanni ha il cestino di mario Risponda a interrogazioni come Chi ha Cosa di X

  9. Esercizio • Definire la regola max(A, B, Max) in modo che in Max ci vada il massimo tra A e B • Pensare anche al caso: • max(A, 5, 9) • A = 9.

  10. Strutture dati • Le strutture dati, anche complesse, sono alla base dei vari linguaggi di programmazione • In Prolog è possibile creare ed utilizzarle in modo palese

  11. Strutture dati • Un database può essere rappresentato in Prolog come un elenco di fatti • Per comprendere come creare/usare le strutture dati in Prolog useremo i seguenti esempi: • Famiglia • Automa non deterministico • Problema delle 8 Regine

  12. Famiglia • Una famiglia può essere rappresentata da un fatto, family, con 3 argomenti: • Padre • Madre • Figli (tramite una lista) • Gli elementi della famiglia sono delle persone (person), rappresentati a sua volta da dei termini complessi formati da 4 elementi: nome, cognome, data di nascita e salario

  13. Famiglia • Rappresentazione della famiglia Smith • family( person(bob, smith, date(7, may,1968),30000), person(ann, smith, date(18, july,1970),32000), [person(dave, smith, date(1, june,1984),0), person(edna, smith, date(25, may,1990),0)]).

  14. Famiglia • Possiamo effettuare varie query, basandoci non solo sui valori ma anche sulla struttura stessa • family(person(_,fox, _, _), _, _). si riferisce alla famiglia fox, usando solo il cognome del padre e nessun altra informazione • Esiste un altro modo per riferirsi alla famiglia fox?

  15. Famiglia • family(_, _, [_,_,_]). Indica una famiglia con 3 figli • Come si può indicare una famiglia con almeno 3 figli ? • Creiamo ora delle regole più “generiche” che però si appoggiano sempre al termine family

  16. Regole per family husband(X):- family(X, _, _). wife(X):- family(_, X, _). child(X):- family(_, _, Children), member(X, Children).

  17. Regole per family exists(X):- husband(X) ; wife(X) ; child(X). salary(person(_, _, _, S), S). dateOfBirth(person(_, _, Date, _),Date).

  18. Possibili query • ?- exists(person(mario, rossi, _, _)). • ?- exists(person(Name, Surname, _, _)). • ?- child(X), dateOfBirth(X, date(_,_,Y)), Y < 2000. • ?- exists(X), salary(X, Y), Y >30000.

  19. Automa non deterministico b s1 s2 a a null b null s4 s3 b

  20. Automa non deterministico final(s3). trans(s1, a, s1). trans(s1, a, s2). trans(s1, b, s1). trans(s2, b, s3). trans(s3, b, s2). trans(s1, a, s4). silent(s2, s4). silent(s3, s1).

  21. Automa non deterministico accepts(State, []):- final(State). accepts(State, [X|Rest]):- trans(State, X, State1), accepts(State1, Rest). accepts(State, Rest):- silent(State, State1), accepts(State1, Rest).

  22. Query Automa • ?- accepts(s1, [a,a,a,b]). • true • ?- accepts(S, [a,b]). • S=s1; • S=s3; • ?- accepts(s1, [X1,X2,X3]). • X1=a X2=a X3=b • … • ?- String=[_,_,_], accepts(s1, String). • String = [a,a,b]; • …

  23. Problema delle 8 Regine • Posizionare 8 regine su di una scacchiera vuota in modo che nessuna possa mangiare o essere mangiata da un’altra • Esistono varie soluzione in Prolog, qui ne viene presentata una semplice con il minimo numero di variabili ridotte al minimo

  24. 8 Regine solution( [] ). solution( [X/Y | Others] ) :- % First queen at X/Y, otherqueens at Others solution( Others), member( Y, [1,2,3,4,5,6,7,8] ), noattack( X/Y, Others). % First queen doesnotattackothers noattack( _, [] ). % Nothingtoattack noattack( X/Y, [X1/Y1 | Others] ) :- Y =\= Y1, % DifferentY-coordinates Y1-Y =\= X1-X, % Differentdiagonals Y1-Y =\= X-X1, noattack( X/Y, Others). % A solutiontemplate template( [1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8] ).

  25. Esercizi • Famiglia: • Scrivere la regola per avere le famiglie senza figli • Scrivere la regola per avere Il reddito totale di una famiglia • Scrivere la regola per avere le famiglie in cui i figli guadagnano più dei genitori

  26. Esercizi • Automa: • Scrivere una regola che accetti lo stato iniziale e due numeri che rappresentino il numero minimo e massimo di transizioni (non nulle) che si possono fare. Tale regola dovrà accettare anche una variabile che conterrà la lista dei simboli di input usati per andare dallo stato iniziare a quello finale

  27. Esercizi • 8 Regine: • Modificare il programma per trattare un numero variabile di regine • Scrivere una nuova versione della soluzione al problema delle 8 regine

More Related