This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:10-prolog-introducere [2016/05/10 07:42] asistent [Liste] |
laboratoare:10-prolog-introducere [2016/05/24 15:46] (current) mihai_dan.masala |
||
---|---|---|---|
Line 15: | Line 15: | ||
Folosim faptele pentru a exprima un adevar. De exemplu vrem sa "definim" ca Gigel este barbat. Pentru a defini o regula este suficient sa ii definim numele(de preferat sugestiv) si sa ne hotaram care este "actorul". | Folosim faptele pentru a exprima un adevar. De exemplu vrem sa "definim" ca Gigel este barbat. Pentru a defini o regula este suficient sa ii definim numele(de preferat sugestiv) si sa ne hotaram care este "actorul". | ||
In cazul de fata Gigel este actorul iar numele regulii este barbat => **barbat(gigel).** \\ | In cazul de fata Gigel este actorul iar numele regulii este barbat => **barbat(gigel).** \\ | ||
- | Observati **numele regulii** - barbat - **numele actorului** - gigel(cu litera mica!) - si **punctul** de la sfarsit regulii(echivalent ";") | + | Observati **numele regulii** - barbat - **numele actorului** - gigel(cu litera mica!) - si **punctul** de la sfarsitul regulii(echivalent ";") |
==== Interogari ==== | ==== Interogari ==== | ||
Line 60: | Line 60: | ||
Aritmetica in Prolog are o particularitate legate de sintaxa: 7 + 2 = 9 (in limbaj natural) se traduce in 9 is 7 + 2 (in Prolog). \\ | Aritmetica in Prolog are o particularitate legate de sintaxa: 7 + 2 = 9 (in limbaj natural) se traduce in 9 is 7 + 2 (in Prolog). \\ | ||
- | Pentru a obtine un rezulta putem forma urmatoarea interogare: ** R is 2+3.** (R va unifica cu 5). \\ | + | Pentru a obtine un rezultat putem forma urmatoarea interogare: ** R is 2+3.** (R va unifica cu 5). \\ |
Sa observam urmatoarea regula: **compute_sum(A,B,Sum):- Sum is A+B.**. Avem o regula care calculeaza suma primelor doua variabile si "salveaza" rezultatul in ultima variabila. Cand avem de scris reguli cu input si output este important sa fiti consecventi in alegerea unei conventii(in exemplul oferit variabilele de intrare sunt pozitionate la inceputul regulii pe cand cele de iesire sunt la sfarsitul cererii). | Sa observam urmatoarea regula: **compute_sum(A,B,Sum):- Sum is A+B.**. Avem o regula care calculeaza suma primelor doua variabile si "salveaza" rezultatul in ultima variabila. Cand avem de scris reguli cu input si output este important sa fiti consecventi in alegerea unei conventii(in exemplul oferit variabilele de intrare sunt pozitionate la inceputul regulii pe cand cele de iesire sunt la sfarsitul cererii). | ||
Line 90: | Line 90: | ||
H2 = 2. | H2 = 2. | ||
</code> | </code> | ||
- | In urma comenzii, primele doua elemente ale liste vor fi legate la variabilele **H1** si **H2**. Simbolul **'_'** (underscore) are un comportament similar cu cel din Haskell si anume cel de variabila anonima. Folosim acest simbol cand nu dorit sa legam ceva la o variabila. | + | In urma comenzii, primele doua elemente ale liste vor fi legate la variabilele **H1** si **H2**. Simbolul **'_'** (underscore) are un comportament similar cu cel din Haskell si anume cel de variabila anonima. Folosim acest simbol cand nu dorim sa legam ceva la o variabila. |
+ | Incercam in continuare sa calculam lungimea unei liste. \\ | ||
+ | Incepem prin a defini o regula prin care determinam daca ceva reprezinta o lista. | ||
+ | <code> | ||
+ | empty(L) :- L = []. | ||
+ | isList(L) :- empty(L). | ||
+ | isList([H|T]) :- isList(T). | ||
+ | </code> | ||
+ | Ne dam seama ca putem simplifica codul. | ||
+ | <code> | ||
+ | isList([]). | ||
+ | isList([_|T]) :- isList(T). | ||
+ | </code> | ||
+ | |||
+ | Calculam acum lungimea unei liste. | ||
+ | <code> | ||
+ | len(L, R) :- empty(L), R = 0. | ||
+ | len([H|T], R) :- isList(L), len(T, R1), R = R1 + 1. | ||
+ | </code> | ||
+ | Observati ca secventa nu functioneaza cum ar trebui pentru ca unificarea previne evaluarea lui R. Varianta finala a codului este: | ||
+ | |||
+ | <code> | ||
+ | len([], 0). (unificare implicita) | ||
+ | len([_|T], R) :- len(T, R1), R is R1+1. | ||
+ | </code> | ||
+ | |||
+ | Cum determinam daca un element apartine unei liste? | ||
+ | <code> | ||
+ | contains(E, [E|_]). | ||
+ | contains(E, [X |T]) :- E \= X, contains(E, T). | ||
+ | |||
+ | ?- contains(1, [1,2,3]). | ||
+ | true; | ||
+ | false. | ||
+ | </code> | ||
+ | De ce prima data obtinem **true**, iar dupa aceea **false**? | ||
==== Exercitii liste & diverse ==== | ==== 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 ''firstTwo(X,Y,L)'' care leaga variabilele ''X'', ''Y'' la primele doua elemente din lista ''L'', daca acestea exista. | ||
- | - Definiti predicatul ''contains(E,L)'' care verifica daca elementul la care este legat ''E'' exista in lista ''L''. | + | - Definiti predicatul ''notContains(E,L)'' care verifica daca elementul la care este legat ''E'' nu exista in lista ''L''. |
- | - Definiti predicatul ''notcontains(E,L)''. | + | |
* Poate acest predicat sa fie folosit pentru a genera toate elementele care nu sunt in ''L''? Justificati raspunsul. | * 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 ''unique(L1,L2)''. ''L2'' este lista ''L1'' fara elemente duplicate. | ||
Line 121: | Line 155: | ||
==== Resurse (functii matematice) ==== | ==== Resurse (functii matematice) ==== | ||
* [[http://www.swi-prolog.org/man/arith.html|Functii utile in Prolog]] | * [[http://www.swi-prolog.org/man/arith.html|Functii utile in Prolog]] | ||
+ | * [[http://www.learnprolognow.org/lpnpage.php?pageid=online| Tutorial Prolog]] | ||
=== Solutii === | === Solutii === | ||
[[https://github.com/Programming-Paradigms/Labs/archive/master.zip|Solutii]] | [[https://github.com/Programming-Paradigms/Labs/archive/master.zip|Solutii]] |