This is an old revision of the document!
===== Laborator 9 - Prolog: Introducere ===== ==== 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. ==== Structura unui program Prolog ==== Un program Prolog contine (doar) trei constructii: * fapte * reguli * interogari ==== Fapte ===== 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).** \\ Observati **numele regulii** - barbat - **numele actorului** - gigel(cu litera mica!) - si **punctul** de la sfarsit regulii(echivalent ";") ==== Interogari ==== Interogarile sunt metodele prin care noi putem sa ii cerem ceva programului. Pentru a "intreba" ceva este suficient sa scriem in interpretor ce vrem sa aflam. \\ De exemplu vrem sa aflam daca Gigel este barbat, pur si simplu "intrebam" in interpretor **barbat(gigel).** (observati numele regulii, actorul si punctul de la final!).\\ Raspunsul dat de programul nostru este **true**. Raspunsul este afirmativ deoarece acest fapt exista in cadrul programului nostru in setul de fapte si reguli (denumit in continuare baza de cunostinte). \\ \\ Ce va raspunde programul la urmatoarea interogare: **copil(gigel).***? \\ Raspunsul este **false** (nu avem nicio informatie in baza de cunostinte legata de varsta lui Gigel). \\ \\ Dar la intrebarea **femeie(andreea)**? De ce?\\ ==== Reguli ==== Regulile ne permit sa exprimam o legatura intre anumite fapte si reguli. De exemplu, pentru ca Gigel sa fie sot el trebuie sa fie insurat si sa fie barbat.\\ barbat(gigel).\\ insurat(gigel).\\ **sot(gigel):- barbat(gigel),insurat(gigel)**. Ce spune aceasta regula? Ce inseamna **,**? \\ Tocmai am definit o regula care spuna ca Gigel este sot daca Gigel este barbat **si** daca Gigel este insurat. Virgula este modul in care se exprima conjunctia logica in Prolog \\ Care va fi raspunsul la urmatoarea interogare: **sot(gigel).** ? ==== 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 ''contains(E,L)'' care verifica daca elementul la care este legat ''E'' 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. - 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 ==== - 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 ==== - Stabiliti o conventie de reprezentare pentru expresii generate de gramatica de mai jos, urmarind acceeasi abordare ca la arbori: <code> <expr> ::= <valoare> | <variabila> | <expr> + <expr> | <expr> * <expr> <variabila> ::= string <valoare> ::= orice </code> - Scrieti un predicat ''eval(Expr,R)'' unde ''R'' este rezultatul evaluarii lui ''Expr''. ''Expr'' **nu contine** variabile. - Scrieti un predicat care permite evaluarea unei expresii ce contine variabile. ==== Resurse (functii matematice) ==== * [[http://www.swi-prolog.org/man/arith.html|Functii utile in Prolog]] === Solutii === [[https://github.com/Programming-Paradigms/Labs/archive/master.zip|Solutii]]