Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
pp:l07 [2017/05/02 20:20] sergiu created |
pp:l07 [2019/05/06 11:41] (current) dmihai [Recommended Reading] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laborator 9 - Prolog: Introducere ===== | + | ===== Prolog: Introducere ===== |
+ | |||
+ | Scopul laboratorului: | ||
+ | |||
+ | * Familiarizarea studenților cu limbajul Prolog | ||
==== Despre Prolog ==== | ==== Despre Prolog ==== | ||
- | Prolog este un limbaj de programare centrat pe un set mic de mecanisme de baza(e.g. pattern-matching, backtracking). Desi setul de mecanisme de baza este limitat, Prolog este un limbaj foarte puternic si flexibil. | + | Prolog este un limbaj de [[https://en.wikipedia.org/wiki/Logic_programming|programare logică]], bazat pe un set mic de mecanisme de baza (e.g. pattern-matching, backtracking). Deși setul de mecanisme de baza este limitat, Prolog este un limbaj foarte puternic și flexibil. |
+ | |||
+ | ==== SWI-Prolog ==== | ||
+ | |||
+ | Există mai multe implementări ale limbajului Prolog. Noi vom folosi SWI-Prolog, disponibil [[http://www.swi-prolog.org/Download.html|aici]], sau puteți instala pachetul ''swi-prolog''. | ||
+ | Vom lucra în modul interactiv, care ne permite să apelăm funcții din consolă și să vedem rezultatul lor. Pentru modul interactiv, rulați ''swipl''. | ||
+ | |||
==== Structura unui program Prolog ==== | ==== Structura unui program Prolog ==== | ||
Line 128: | Line 139: | ||
</code> | </code> | ||
De ce prima data obtinem **true**, iar dupa aceea **false**? | De ce prima data obtinem **true**, iar dupa aceea **false**? | ||
- | ==== Exercitii liste & diverse ==== | ||
- | - Definiti predicatul ''firstTwo(X,Y,L)'' care leaga variabilele ''X'', ''Y'' la primele doua elemente din lista ''L'', daca acestea exista. | ||
- | - Definiti predicatul ''notContains(E,L)'' care verifica daca elementul la care este legat ''E'' nu exista in lista ''L''. | ||
- | * Poate acest predicat sa fie folosit pentru a genera toate elementele care nu sunt in ''L''? Justificati raspunsul. | ||
- | - Definiti predicatul ''unique(L1,L2)''. ''L2'' este lista ''L1'' fara elemente duplicate. | ||
- | - Definiti predicatul ''listOnly(L1,L2)''. ''L2'' este lista ''L1'' care contine doar elementele de tip lista. Exemplu: ''listOnly([1,[2,3],4,[5],6], [ [2,3],[5]]).'' | ||
- | - Implementati ''insertionSort'' in Prolog. | ||
- | * Idenficati predicatele necesare, aritatea fiecaruia, variabilele care reprezinta input-ul, respectiv output-ul. | ||
- | ==== Arbori ==== | + | ==== Exerciții ==== |
- | - Stabiliti o conventie de reprezentare pentru arbori. Ilustrati conventia in Prolog. Exemplu: ''T=...''. | + | |
- | - Implementati predicatele ''size(T,S)'' si ''height(T,H)''. | + | |
- | - Definiti predicatul ''flatten(T,L)'' unde ''T'' este un arbore. | + | |
- | ==== Reprezentarea datelor in Prolog ==== | + | === I. Liste === |
- | - Stabiliti o conventie de reprezentare pentru expresii generate de gramatica de mai jos, urmarind acceeasi abordare ca la arbori: | + | |
- | <code> | + | - Definiți predicatul ''firstTwo(L, X, Y)'' care leagă variabilele ''X'', ''Y'' la primele două elemente din lista ''L'', dacă acestea exista. |
- | <expr> ::= <valoare> | <variabila> | <expr> + <expr> | <expr> * <expr> | + | - Definiți predicatul ''notContains(E, L)'', care verifică dacă elementul la care este legat ''E'' **nu există** in lista ''L''. |
- | <variabila> ::= string | + | - Definiți predicatul ''unique(L1, L2)''. ''L2'' este lista ''L1'' fără elemente duplicate. |
- | <valoare> ::= orice | + | - Definiți predicatul ''listOnly(L1, L2)''. ''L2'' este lista ''L1'' care conține doar elementele de tip listă. Exemplu: ''listOnly([1,[2,3],4,[5],6], [ [2,3],[5]]).'' |
- | </code> | + | - Implementati ''insertionSort'' in Prolog. |
- | - Scrieti un predicat ''eval(Expr,R)'' unde ''R'' este rezultatul evaluarii lui ''Expr''. ''Expr'' **nu contine** variabile. | + | * Idenficati predicatele necesare, aritatea fiecăruia, variabilele care reprezinta input-ul, respectiv output-ul. |
- | - Scrieti un predicat care permite evaluarea unei expresii ce contine variabile. | + | |
+ | === II. Arbori === | ||
- | ==== Resurse (functii matematice) ==== | + | - Stabiliți o convenție de reprezentare pentru arbori. Ilustrați convenția in Prolog. Exemplu: ''T=...''. |
- | * [[http://www.swi-prolog.org/man/arith.html|Functii utile in Prolog]] | + | - Definiți predicatul ''size(T, S)'', unde ''T'' este un arbore, iar ''S'' numărul de noduri. |
- | * [[http://www.learnprolognow.org/lpnpage.php?pageid=online| Tutorial Prolog]] | + | - Definiți predicatul ''height(T, H)'', unde ''T'' este un arbore, iar ''H'' este numărul de niveluri. |
+ | - Definiți predicatul ''flatten(T, L)'' unde ''T'' este un arbore, iar ''L'' o listă de noduri, în [[https://en.wikipedia.org/wiki/Tree_traversal#Pre-order_(NLR)|preordine]]. | ||
+ | ==== Recommended Reading ==== | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - I. Logic Programs - 1. Basic Constructs]] | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - I. Logic Programs - 2. Database Programming]] | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - I. Logic Programs - 3. Recursive Programming]] | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - II. The Prolog Language - 6. Pure Prolog]] | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - II. The Prolog Language - 7. Programming in Pure Prolog]] | ||
+ | * [[https://mitpress.mit.edu/books/art-prolog-second-edition|The Art of Prolog - II. The Prolog Language - 8. Arithmetic]] | ||
+ | * [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse1|Learn Prolog Now! - Chapter 1 Facts, Rules and Queries]] | ||
+ | * [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch2|Learn Prolog Now! - Chapter 2 Unification and Proof Search]] | ||
+ | * [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch3|Learn Prolog Now! - Chapter 3 Recursion]] | ||
+ | * [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch4|Learn Prolog Now! - Chapter 4 Lists]] |