Sunteți pe pagina 1din 16

Laborator 1 Limbajul Prolog nceputul programrii logice poate fi atribuit lui R. Kowalski i A. Colmerauer i se situeaz la nceputul anilor '70.

Kowalski a plecat de la o formul logic de tipul: S1 S2 ... Sn S care are, n logica cu predicate de ordinul nti semnificaia declarativ conform creia S1 S2 ... Sn implic S, adic dac S1 i S2 ... i Sn sunt fiecare adevrate atunci i S este adevrat, i a propus o interpretare procedural asociat. Conform acestei interpretri, formula de mai sus poate fi scris sub forma: S dac S1 i S2 ... i Sn i poate fi executat ca o procedur a unui limbaj de programare recursiv, unde S este antetul procedurii i S1, S2, ... Sn corpul acesteia. Deci, pe lng interpretarea declarativ, logic, a unei astfel de formule, formula poate fi interpretat procedural astfel: pentru a executa S se execut S1 i S2 ... i Sn. n aceeai perioad, A. Colmerauer i colectivul lui de cercetare de la Universitatea din Marsilia au dezvoltat un limbaj de implementare a acestei abordri, pe care l-au denumit Prolog, abreviere de la "Programmation et Logique". De atunci i pn n prezent, limbajul Prolog s-a impus ca cel mai important limbaj de programare logic i s-au dezvoltat numeroase implementri, att ale unor interpretoare, ct i ale unor compilatoare ale limbajului. Limbajul Prolog a fost dezvoltat ca un instrument pentru programarea i rezolvarea de probleme care implicau reprezentri simbolice de obiecte i relaii ntre obiecte, fiind considerat un limbaj cu fundament matematic solid. Limbajul Prolog este un limbaj declarativ susinut de o component procedural. Spre deosebire de limbajele procedurale, cum ar fi C sau Pascal, n care rezolvarea problemei este specificat printr-o serie de pai de execuie sau aciuni, ntr-un limbaj declarativ problema este specificat prin descrierea universului problemei i a relaiilor sau funciilor existente ntre obiecte din acest univers. Exemple de astfel de limbaje sunt cele funcionale, de exemplu Lisp, Scheme, ML, i cele logice, de exemplu Prolog. Soluia problemei nu mai reprezint o execuie pas cu pas a unei secvene de instruciuni. Modul de execuie a programului depinde n primul rnd de definiiile relaiilor, de modul de inferen i de controlul explicit realizat interactiv de ctre programator. Dei iniial a fost gndit pentru un set restrns de probleme, Prolog a devenit cu timpul un limbaj de uz general, fiind o unealt important n aplicaiile de inteligen artificial. Pentru multe probleme, un program Prolog are cam de 10 ori mai puine linii dect echivalentul lui n Pascal. n 1983, cercettorii din Japonia au publicat un plan ambiios de creare a unor calculatoare de generaia a 5-a pentru care Prolog era limbajul de asamblare. Planul nu a reuit, dar acest proiect a marcat o dezvoltare deosebit a interpretoarelor i compilatoarelor de Prolog, precum i o cretere mare a numrului de programatori n acest limbaj. Multe clase de probleme pot fi rezolvate n Prolog, existnd anumite categorii care sunt rezolvabile mult mai uor n Prolog dect n orice alt limbaj procedural. Astfel de probleme sunt n principal cele dedicate prelucrrii simbolice sau care necesit un proces de cutare a soluiei ntr-un spaiu posibil de transformri ale problemei. De asemenea, limbajul Prolog are aplicabilitate n gestiunea bazelor de date relaionale, inteligena artificial, logica matematic, demonstrarea teoremelor, sistemele expert, ingineria arhitectural etc. Exemple de medii de programare ce utilizeaz limbajul Prolog (care ruleaz pe microcalculatoare de tip IBM/PC, fie sub sistemul de operare DOS, fie sub sistemul Windows) sunt: Turbo Prolog (produs al firmei Borland), ARITY Prolog, Visual Prolog, Amzi Prolog, SWI-Prolog etc. Trebuie amintit i faptul c exist i variante de sisteme Prolog sub Unix, de exemplu, GNU Prolog, SWI-Prolog sau sub X Windows. n cadrul acestui laborator se va studia Visual Prolog, care este considerat succesorul Turbo Prolog-ului i PDC Prolog. Visual Prolog este un mediu de programare complet, bazat pe

limbajul de programare Prolog. Visual Prolog conine tot ce este necesar pentru implementarea aplicaiilor: mediu grafic de dezvoltare, compilator, link-editor i depanator. Visual Prolog include o bibliotec ce ofer acces la API, punnd la dispoziia programatorului instrumente pentru: interfaa utilizator grafic, baze de date ODBC/OCI, precum i Internet (socket, ftp, http, cgi etc.). Visual Prolog este recomandat pentru implementarea sistemelor expert, planificare, precum i altor probleme de inteligen artificial. O caracteristic general a programelor ce utilizeaz Prolog-ul este aceea c programatorul specific fapte i relaii despre obiecte, iar sistemul Prolog gsete (prin inferen) noi relaii despre obiecte. Entitile limbajului Prolog Limbajul Prolog este un limbaj logic, descriptiv, care permite specificarea problemei de rezolvat n termenii unor fapte cunoscute despre obiectele universului problemei i a relaiilor existente ntre aceste obiecte. Execuia unui program Prolog const n deducerea implicaiilor acestor fapte i relaii, programul definind astfel o mulime de consecine ce reprezint nelesul sau semnificaia declarativ a programului. Un program Prolog conine urmtoarele entiti: - fapte despre obiecte i relaiile existente ntre aceste obiecte; - reguli despre obiecte i relaiile dintre ele, care permit deducerea (inferarea) de noi fapte pe baza celor cunoscute; - ntrebri (interogri), numite i scopuri, despre obiecte i relaiile dintre ele, la care programul rspunde pe baza faptelor i regulilor existente. 1.1 Fapte Faptele sunt predicate de ordinul nti de aritate n considerate adevrate. Ele stabilesc relaii ntre obiectele universului problemei. Numrul de argumente ale faptelor este dat de aritatea (numrul de argumente) corespunztoare a predicatelor. Interpretarea particular a predicatului i a argumentelor acestuia depinde de programator. Ordinea argumentelor, odat fixat, este important i trebuie pstrat la orice alt utilizare a faptului, cu aceeai semnificaie. Mulimea faptelor unui program Prolog formeaz baza de cunotine Prolog. Se va vedea mai trziu c n baza de cunotine a unui program Prolog sunt incluse i regulile Prolog. 1.2 Scopuri Obinerea consecinelor sau a rezultatului unui program Prolog se face prin fixarea unor scopuri care pot fi adevrate sau false, n funcie de coninutul bazei de cunotine Prolog. Scopurile sunt predicate pentru care se dorete aflarea valorii de adevr n contextul faptelor existente n baza de cunotine. Cum scopurile pot fi vzute ca ntrebri, rezultatul unui program Prolog este rspunsul la o ntrebare (sau la o conjuncie de ntrebri). Acest rspuns poate fi afirmativ, yes, sau negativ, no. Se va vedea mai trziu c programul Prolog, n cazul unui rspuns afirmativ la o ntrebare, poate furniza i alte informaii din baza de cunotine. 1.3 Variabile n Prolog, argumentele faptelor i ntrebrilor pot fi obiecte particulare, numite i constante sau atomi simbolici. Predicatele Prolog, ca orice predicate n logica cu predicate de ordinul I, admit ca argumente i obiecte generice numite variabile. n Prolog, prin convenie, numele argumentelor variabile ncepe cu liter mare (sau cu liniua de subliniere), iar numele constantelor simbolice ncepe cu liter mic. O variabil poate fi instaniat (legat) dac exist un obiect asociat acestei variabile, sau neinstaniat (liber) dac nu se tie nc ce obiect va desemna variabila. Variabilele Prolog sunt locale, nu globale, astfel nct dac dou clauze conin fiecare cte o variabil numit X, atunci vor exista, de fapt, dou variabile distincte X.

La fixarea unui scop Prolog care conine variabile, acestea sunt neinstaniate, iar sistemul ncearc satisfacerea acestui scop cutnd printre faptele din baza de cunotine un fapt care poate identifica cu scopul, printr-o instaniere adecvat a variabilelor din scopul dat. Este vorba de fapt de un proces de unificare a predicatului scop cu unul din predicatele fapte existente n baza de cunotine. La ncercarea de satisfacere a scopului, cutarea se face ntotdeauna pornind de la nceputul bazei de cunotine. Dac se ntlnete un fapt cu un simbol predicativ identic cu cel al scopului, variabilele din scop se instaniaz conform algoritmului de unificare i valorile variabilelor astfel obinute sunt afiate ca rspuns la satisfacerea acestui scop. n cazul n care exist mai multe fapte n baza de cunotine care unific cu ntrebarea pus exist mai multe rspunsuri la ntrebare, corespunznd mai multor soluii ale scopului fixat. Prima soluie este dat de prima unificare i exist attea soluii cte unificri diferite exist. La realizarea primei unificri se marcheaz faptul care a unificat i care reprezint prima soluie. La obinerea urmtoarei soluii, cutarea este reluat de la marcaj n jos n baza de cunotine. Obinerea primei soluii este de obicei numit satisfacerea scopului iar obinerea altor soluii, resatisfacerea scopului. La satisfacera unui scop cutarea se face ntotdeauna de la nceputul bazei de cunotine. La resatisfacerea unui scop, cutarea se face ncepnd de la marcajul stabilit de satisfacerea anterioar a acelui scop. Sistemul Prolog, fiind un sistem interactiv, permite utilizatorului obinerea fie a primului rspuns, fie a tuturor rspunsurilor. n cazul n care, dup afiarea tuturor rspunsurilor, un scop nu mai poate fi resatisfcut, sistemul rspunde no. Nou pentru Visual Prolog: dac o variabil apare doar o dat ntr-o clauz i numele ncepe cu liniu de subliniere, atunci compilatorul Visual Prolog consider aceast variabil ca fiind o variabil anonim. Observaie Compilatorul Visual Prolog nu face distincie ntre literele mici i mari care apar n nume, cu excepia primei litere. Deci, urmtoarele dou nume pot fi folosite pentru a accesa aceeai variabil: SourceCode i SOURCECODE. 1.4 Reguli O regul Prolog exprim un fapt care depinde de alte fapte i este de forma: S :- S1, S2, Sn. cu semnificaia prezentat la nceputul acestui capitol. Fiecare Si, i = 1,n i S au forma faptelor Prolog, deci sunt predicate, cu argumente constante, variabile sau structuri. Aa dup cum s-a precizat, faptul S care definete regula, se numete antet de regul, iar S1, S2, Sn formeaz corpul regulii i reprezint conjuncia de scopuri care trebuie satisfcute pentru ca antetul regulii s fie satisfcut. n condiiile existenei regulilor n baza de cunotine Prolog, satisfacerea unui scop se face printr-un procedeu similar cu cel prezentat n seciunea 1.2, dar unificarea scopului se ncearc att cu fapte din baza de cunotine, ct i cu antetul regulilor din baz. La unificarea unui scop cu antetul unei reguli, pentru a putea satisface acest scop trebuie satisfcut regula. Aceasta revine la a satisface toate faptele din corpul regulii, deci conjuncia de scopuri. Scopurile din corpul regulii devin subscopuri a cror satisfacere se va ncerca printr-un mecanism similar cu cel al satisfacerii scopului iniial. innd cont de cele prezentate pn acum, se poate defini un program Prolog, conform urmtoarei definiii generale: Definiie Un program Prolog (pur) const din: a. o mulime de fapte, cu forma general P. unde P este un literal pozitiv. b. o mulime finit de clauze program (definite), cu forma general:

S: - S1, S2, ..., Sk unde: - P, S1, S2, ..., Sk sunt literali pozitivi, - simbolul - reprezint o implicaie dreapta-stnga, - semnul , nlocuiete conjuncia. Astfel, se obine clauza: S1 S2 ... Sn S sau, mai precis: S1 S2 ... Sn S Acestea sunt numite i clauze procedur, clauze suplimentare sau reguli, unde P este antetul (capul) procedurii, lista S1, S2, ..., Sk este corpul procedurii, fiecare Si fiind un apel de procedur. c. o clauz scop (interogare) cu forma general: ? - S1, S2, ..., Sk care reprezint, de asemenea, o clauz: S1 S2 ... Sn 0 sau, S1 S2 ... Sn. Pentru n = 0, se obine clauza vid. Mulimea faptelor sau mulimea clauzelor procedur pot coincide cu mulimea vid, dar nu ambele n acelai timp. n concluzie, programul logic este rulat (activat) pentru precizarea clauzei scop. Se pornete cu clauza de baz i apoi literalii pozitivi sunt eliminai, producndu-se noi clauze scop. Se mai spune c pentru a executa o procedur, trebuie s fie satisfcut (ndeplinit) antetul procedurii, iar pentru a ndeplini un antet de procedur S, trebuie s se execute toate apelurile de procedur Si, prezente n corpul acesteia. Astfel, un scop reprezint i o secven de apeluri de procedur care apar n program. Rezultatul dorit se obine dup execuia cu succes a tuturor acestor apeluri de procedur (prin execuia anumitor clauze procedur). Concluzii n concluzie, innd cont de cele prezentate, se pot enumera, pe scurt, principalele caracteristici ale limbajului Visual Prolog: - este un limbaj declarativ; - folosete fapte i reguli; - poate face deducii; - execuia unui program Visual Prolog este controlat automat; - are o sintax simpl; - este un limbaj puternic; - permite dezvoltarea programelor interactive; - are interfa grafic plcut; - poate lucra n condiii de incertitudine; - este eliminat cazul de cutare ce nu duce nicieri (ex. bucle infinite), Prolog-ul raportnd cazul n care nu exist soluii, putnd s ofere soluii pariale. Instalarea Visual Prolog-ului Visual Prolog-ul este o implementare a Prolog-ului pentru calculatoarele compatibile IBM PC. Mai trebuie precizat i faptul c este un compilator rapid. Trebuie specificat faptul c Visual Prolog permite lucrul sub Windows 3-x/95/98/NT/2000, OS/2 i ofer suport n mod text pentru DOS, Linux i SCO UNIX. Prezentarea mediului de programare Visual Prolog Pentru lansare, se va activa meniul Start, Programs, i se va selecta Visual Prolog 5.2 Personal Edition, Vip32. La lansare pe ecran este afiat o fereastr al crei meniu principal (meniul bar) const din submeniurile: File Edit Project

Options Resource Window Help Selectarea unuia dintre submeniuri se face apsnd simultan tastele Alt+litera marcat (highlight) sau apsnd tasta funcional F10 i cu ajutorul tastelor sgei, alegnd opiunea dorit. Meniurile sunt de tip pull-down, n continuare fiind prezentate pe scurt meniurile i o serie de opiuni utilizate frecvent: - File ofer opiunile pentru gestiunea fiierelor, astfel: o New (F7) permite crearea unui nou fiier; o Open (F8) permite ncrcarea unui fiier existent; o Close inchide fiierul curent; o Save (F2) permite salvarea fiierului curent; o Save As permite salvarea fiierului curent sub alt nume (deci, practic, modificarea numelui unui fiier); o Print permite listarea la imprimant; o Exit (Alt + x) ieirea total n sistemul de operare (nchidere VIP). - Project New Project (Ctrl + F7) permite crearea unui proiect nou; Open Project (Ctrl + F8) permite ncrcarea/crearea unui proiect; Close Project permite nchiderea unui proiect; Save Project (Ctrl+S) permite salvarea unui proiect; Compile Module (Ctrl+F9) utilizat pentru compilarea unui modul; Build (Alt + F9) folosit pentru compilarea i link-editarea unui proiect; Rebuild All (Ctlr + Alt + F9) permite compilarea i link-editarea tuturor fiierelor din cadrul unui proiect, chiar dac s-au operat sau nu modificri de la ultima compilare (spre deosebire de comanda Build, care realizeaz o verificare a timpului fiierului i recompileaz doar fiierele care au fost modificate de la ultima compilare); Link Only (Shift + F9) utilizat pentru link-editarea fiierelor obiect i librriilor n vederea obinerii modulului executabil sau DLL. n acest caz, nu se verific dac exist vreun fiier care ar trebui compilat sau recompilat; Run (F9) pentru compilarea, link-editarea unui proiect n vederea obinerii executabilului, i lansarea n execuie a respectivului proiect; Test Goal (Ctrl + G) se poate utiliza pentru lansarea n execuie a unui program (nu a unui proiect). Practic, din fiierul curent deschis n editare se genereaz un executabil special TestGoal i se ruleaz acest executabil. Programul TestGoal ncearc s satisfac seciunea goal, n cazul n care toate scopurile au fost executate cu succes, atunci programul TestGoal se termin cu succes, fiind afiate toate soluiile gsite, precum i numrul de soluii pentru toate variabilele. Trebuie menionat c n orice moment se poate apela Help-ul, apsnd tasta funcional F1. Ferestrele Prolog-ului Mediul de programare Visual Prolog pune la dispoziia utilizatorului o serie de ferestre : - fereastra proiectului - fereastra de editare - este cea n care se ncarc sau se editeaz programele. - fereastra de dialog - este fereastra implicit a intrrilor i ieirilor din program.

fereastra mesajelor - este o fereastr a ieirilor (mesajelor) produse de sistem. Se refer la comenzile de compilare, rulare, ncrcare, salvare, mesaje de eroare etc. fereastra de depanare a programelor - se utilizeaza pentru rularea pas cu pas, a programului

Exemple de programe Visual Prolog Pentru lansarea n execuie a acestor programe trebuie parcuri urmtorii pai: 1. din meniul Project se alege opiunea New Project 2. n cutia de dialog care este afiat pe ecran, la General se specific numele proiectului i se seteaza opiunea Multiprogrammer Mode; 3. n sub-fereastra Target, se alege tipul proiectului (pentru exemplele considerate se selecteaz la Platform, DOS); 4. se apas butonul Create; 5. se editeaza fisierul cu extensia *.pro i se scrie programul; 6. se apas tasta F9 pentru lansarea n execuie a proiectului. 1. Afiarea unui text pe ecran. goal write (Hello !). unde: - goal reprezint scopul programului - write (Variabila | constanta) permite scrierea pe ecran a valorii variabilei sau constantei. 2. Afiarea unui text ntr-o fereastr utilizator. goal makewindow(1, 7, 7, Visual Prolog, 2, 10, 20, 60), nl, write (Primul program!\nSisteme expert). unde: goal reprezint, aa cum s-a specificat anterior, scopul programului makewindow (NrFereastra, AtrEcran, AtrCadru, Titlu, Rind, Coloana, Latime, Inaltime) este un predicat predefinit care creeaz o fereastr utilizator. Parametrii reprezint: numrul ferestrei, atributele (culoarea fondului i culoarea utilizat pentru afiare) ferestrei, atributele chenarului ferestrei, titlul ferestrei (centrat sus), coordonatele colului stnga sus, limea i nlimea ferestrei. Atributul de culoare reprezint un numr ntreg obinut prin adunarea unui cod corespunztor culorii fondului i a unui cod corespunztor culorii pentru afiare. Dac se dorete s se obin un efect de clipire a ecranului, se adaug 128 la codul obinut anterior. Codurile culorilor se gsesc n tabelul de la sfritul exerciiului. Colul stnga sus al ecranului are coordonatele 0, 0. nl predicat care ntoarce true i care are ca efect trecerea la rnd nou. write (Variabila | constanta) aa cum s-a specificat anterior, permite, printre altele, scrierea unui text pe ecran. Trebuie precizat faptul c se permite utilizarea secvenei escape \n, care are acelai efect ca i nl. Culoare text Codurile culorilor Cod Culoare fond Cod

Negru Albastru Verde Bleu Rou Mov Maro Alb Gri albastru deschis verde deschis Bleu deschis Rou deschis Mov deschis Galben alb intens

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

negru albastru verde bleu rou mov maro alb

0 16 32 48 64 80 96 112

3. Citirea i afiarea unui ir de caractere n Visual Prolog. goal makewindow(1, 7, 7, Al doilea program, 2, 10, 20, 60), nl, write(Introduceti numele dvs.\nsi apasati <CR>\n), cursor(3, 3), readln(Nume), nl, write(Bine ai venit, , Nume). unde, n plus fa de exemplul anterior s-au utilizat: - cursor(Rind, Coloana) determin poziionarea cursorului n cadrul ferestrei pe linia Rind, coloana indicat de al doilea parametru. - readln(StringVar) permite citirea unei variabile de tip ir de caractere (s-a specificat anterior faptul c variabilele n Visual Prolog se scriu cu liter majuscul). Tipuri de obiecte Visual Prolog Programele Visual Prolog conin obiecte i relaii dintre aceste obiecte. Obiectele sunt entiti distincte ale lumii reale (obiecte reale fizice) sau abstracte (obiecte abstracte). n Prolog, obiectele sunt reprezentate prin nume simbolice. Regulile sintactice aplicate la formarea numelor simbolice pentru obiecte permit definirea mai multor tipuri de obiecte: 1.Tipul elementar: A.Standard A1. caracter - char: un caracter ncadrat ntre dou caractere apostrof; A2. ntreg - integer: ntreg cuprins n intervalul [-32768, 32767]; A3. real - real: numr real, echivalent cu double din C i al crui modul este n intervalul [1e-307, 1e308] A4. ir - string: secven de caractere, ce este implementat ca un pointer la un tablou terminat prin zero, ca i n C. Pentru iruri sunt permise dou formate: secven de litere, numere i liniu de subliniere, n care primul

caracter nu este majuscula (de ex., numar_telefon); secven de caractere ncadrat ntre ghilimele, maxim 250 caractere (de exemplu, sir de caractere); A5. simbol - symbol: analog ca la tipul string, cu diferena c primul caracter este liter mic (n reprezentarea intern string-ul i simbolul gen string nu sunt identice; pentru simbol se construiete un tabel, el este unic i regsit la fiecare citare - practic se lucreaz cu adresa lor, deci se constat o mare rapiditate de acces; n cazul string-urilor, acestea sunt tratate caracter cu caracter) A6. fiier - file: nume simbolic de fiier A7. selector de arbore binar - bt_selector: selectorul unui arbore este un numr natural, cu valoarea minim 0, prin care se face referin n program la arborele binar; baza extern de cunotine are ataat un arbore binar sau mai muli arbori, prin care se asigur cutarea n baza de cunotine A8. domeniu - place: locul ocupat de un fiier B. Definit de utilizator Sunt tipuri de date complexe, cum potate fi lista: - de tipuri elementare - de tipuri compuse n afara celor menionate anterior, mai trebuie amintite i urmtoarele tipuri de date, pentru care s-a notat n parantez intervalul: short (intervalul +32768, 32767), ushort (valori n intervalul 0, 65535), long (intervalul 2147483648, 2147483647), ulong (0, 4294967295), unsigned (valori n intervalul 0, 4294967295), byte (0, 255), sbyte (-128, 127), word (0, 65535), dword (0, 4294967295). O valoare ntreag poate fi precedat de 0x sau 0o, indicnd sintaxa hexazecimal, respectiv octal. Trebuie specificat faptul c n declaraiile domain, cuvintele cheie signed i unsigned pot fi utilizate mpreun cu byte, word, i dword. Un obiect sau o variabil care este de un tip, nu poate apare n locuri (pe poziii) unde se cere alt tip. Excepie fac cteva tipuri standard pentru care exist conversie automat. Conversiile automate admise sunt: - ntre string i simbol; - ntre integer, char i real (char e reprezentat ca un cod ASCII - deci numeric; analog, un integer poate fi considerat un cod ASCII; orice ntreg e un real). Obs. importanta: Niciodat tipurile utilizator nu pot fi echivalate unul cu altul.

Din cele prezentate mai sus, rezult o prim utilitate a declarrii de tipuri, aceea de a declara tipuri specifice, care pe de o parte fac ca programul s fie mai lizibil, pe de alt parte definesc clase peste datele utilizate. O alt utilitate este aceea de a defini - cum se va vedea mai trziu - tipuri complexe. Se reamintete faptul c n Prolog numele obiectelor ncep cu liter mic, putnd fi urmat de cifre, litere sau semnul "_". Variabilele Variabilele pot avea un coninut aleator n timpul prelucrrii. Numele de variabile este constituit dintr-o succesiune de caractere (litere, cifre, caracterul "_"), n care primul caracter este o liter mare sau "_". De asemenea, se ntlnete i variabila reprezentat prin "_", denumit

variabil anonim care, practic, specific doar prezena unei variabile, fr ca aceasta s fie utilizat. Utilizarea unei variabile anonime semnific faptul ca nu intereseaz valoarea la care se va instania acea variabila. Variabilele prezente n structura clauzelor au efect local n cadrul respectivei clauze, fiecrei variabile legndu-i-se o valoare, pentru ca ieirea din respectiva clauz s determine dezlegarea ei de valoare. Dou clauze pot folosi acelai nume pentru o variabil, neexistnd nici un fel de legtur ntre ele. Iniial, o variabil nu are valoare (este nelegat), n cursul execuiei programului, variabila putnd lua valori. Prolog se bazeaz pe ''clauzele Horn'' care formeaz un subset simplificat al unui sistem formal, numit ''logica predicatelor''. Logica predicatelor a fost dezvoltat pentru o mai uoar exprimare n forma scrisa a ideilor bazate pe logica. n principiu, un enun exprimat printr-o propoziie n limbaj natural poate fi transpus folosind sintaxa din logica predicatelor, astfel: - se elimina cuvntul mai puin important dintr-o propoziie; - se transforma propoziia, punnd pe prima poziie ''relaia'' si grupnd obiectele dup relaie. Astfel, obiectele devin argumentele asupra crora acioneaz relaia respectiv. Exemplu: Propoziii limbaj natural Bunicul lui Mircea este Aurel. Casa este nalta. Lui Marius i place o masina daca masina este verde.

Sintaxa-logica predicatelor bunic(mircea, aurel). nalt(casa). place(marius, Masina) if verde(Masina).

Un program Visual Prolog este o mulime de clauze Visual Prolog. Aa dup cum s-a precizat, acestea sunt de trei tipuri: fapte, reguli i scopuri. Se prezint, pe scurt, fiecare dintre acestea. Faptele sunt declaraii de predicate n care toate argumentele sunt obiecte cunoscute (nu conin variabile). Conceptual, faptele se refer fie la caracteristicile obiectelor, fie la relaiile dintre mai multe obiecte. Faptele sunt reprezentate prin urmtoarea structur sintactic: nume_predicat(arg1, arg2, ..., argn). unde, 1. nume_predicat este identificatorul unui atribut, format dintr-o succesiune de caractere (litere, cifre, liniua de subliniere "_"), dar cu primul caracter fiind o liter mic; 2. arg1, arg2, ..., argn - identific argumentele predicatului care, din punct de vedere simbolic pot fi nume de obiecte sau de variabile. Se poate ca un predicat s nu aib nici un argument, dar utilizarea acestor predicate este limitat. Se face precizarea c faptele se termin cu punct. Se recomand gruparea faptelor la nceput. Exemple: papagal(coco). - predicat de aritate 1. deplaseaza(cub, camera1, camera2). - este predicat de aritate 3. Deci, se poate spune c faptele sunt relaii sau proprieti pe care programatorul le cunoate ca fiind adevrate.

Regulile sunt predicate definite condiional, a cror form sintactic este: nume_predicat(arg1, arg2, ..., argn) if nume_predicat1(arg11, arg12, ..., arg1l) [and nume_predicati(argi1, argi2, ..., argik)] [or nume_predicat(arg1, arg2, ..., argn) if nume_predicatm(argm1, argm2, ..., argmq) [and nume_predicatp(argp1, argp2, ..., argpk)] or ... ] Argumentele pot fi variabile. Se observ c un predicat este adevrat dac sunt ndeplinite simultan una sau mai multe condiii, sau dac se verific alt(e) set(uri) de condiii. Se mai spune c predicatul este definit prin clauzele ce urmeaz dup if. Deci, dac sunt adevrate condiiile, se poate deduce c i capul regulii este adevrat. Capul regulii este concluzia tras cnd toate condiiile sunt adevrate. n capul regulii este doar un singur predicat. Rezult c n Visual Prolog, regulile sunt prezente numai n forma regulilor inductive, n care prile regulii - concluzia i premisele - sunt separate prin "dac" (if). Un fapt poate fi privit i ca o regul cu corpul vid. Aa dup cum se poate observa i din sintax, o regul poate da mai multe variante de evaluare (legate prin or), care vor fi n mod obligatoriu grupate. n cadrul aceleiai variante condiiile ce trebuie ndeplinite simultan sunt legate prin "and". n Visual Prolog, exist urmtoarele notaii echivalente pentru simbolurile if, and, or: ":-" pentru if, "," pentru and, ";" pentru or. Se face precizarea c regulile se termin cu punct, acesta fiind folosit ca element lexical de precizare a sfritului regulii. Dac n scrierea unei reguli, o variabil apare o singur dat (semnificnd faptul c valoarea ei nu este folosit), compilatorul de Visual Prolog afieaz un mesaj de avertisment: "... Unused variable" caz n care se recomand utilizarea unei variabile anonime, care se poate lega la orice valoare (dar valoarea ei nu se poate folosi). Regulile sunt reguli de raionare (deducie), dar i de execuie n msura n care sunt legate variabile i se fac anumite evaluri. Dac regula este de execuie (oarecum procedural), predicatul poate s nu aib nici un argument. Deci, se poate spune c regulile sunt relaii de dependen, care permit ca Prolog-ul s obin (prin inferen) o informaie din alta, o regul fiind adevrat dac setul de condiii dat se dovedete a fi adevrat. Scop sau goal reprezint ceea ce se caut.

Structura programelor Visual Prolog Un program Prolog conine urmtoarele seciuni: - domains; - predicates; - goal; - clauses; - constants; - databases. Se face precizarea c nu toate seciunile sunt obligatorii. Clauses conine fapte i reguli (care au fost prezentate mai sus), sau mai precis n aceast seciune se definesc predicatele. Argumentele unei clauze sunt n ordine bine definit, fiecare argument avnd un anume tip. Seciunea CLAUSES trebuie s nceap cu cuvntul cheie CLAUSES. Aa cum s-a specificat, att faptele, ct i regulile trebuie s se termine cu punct (.). De exemplu, afirmaia "Popescu lucreaz la biroul aprovizionare" poate fi exprimat n Prolog astfel: lucreaza('Popescu', biroul_aprovizionare) Modul de formulare al clauzei sau mai precis, ordinea argumentelor este n totalitate la latitudinea programatorului. Astfel, afirmaia anterioar poate fi exprimat i astfel: lucreaza(biroul_aprovizionare, 'Popescu') Oricare dintre aceste dou variante este corect pentru Visual Prolog, singurul criteriu de selecie fiind doar percepia utilizatorului. O form odat folosit trebuie respectat cu consecven n ntregul program. n clauza urmtoare, primul argument este o variabil: lucreaza(Persoana, biroul_aprovizionare) Predicates este acea seciune care conine fiecare predicat ce apare citat n clauze i precizeaz tipul argumentelor. Se spune c reprezint descrierea "ideal" a clauzelor. Deci predicates este un fel de catalog al tuturor predicatelor utilizate, care arat ce nume au aceste predicate, fiecare predicat ce argumente are: cte, n ce ordine, de ce tip (ca un fel de seciune a declaraiilor de funcii n C). Fiecare predicat cnd e apelat n clauze, trebuie s respecte numele i argumentele unui predicat descris n predicates. Dac nu respect tipul i ordinea argumentelor, se obin erori. Totui, se admit ca dou nume de predicat identice s aib un numr diferit de argumente. n acest caz, se recomand ca cele dou declaraii s fie una dup alta, att n predicates, ct i n clauses. Se spune c un predicat are aritate (numrul de argumente) multipl. Visual Prolog va accepta aritatea multipl, n interior va considera totui c e vorba de predicate diferite, cu nume identic. Numele predicatului este un ir de caractere care poate conine litere, cifre i semnul "_", dar care ncepe obligatoriu cu o liter (preferabil, liter mic). Dac un nume de predicat este compus din mai multe cuvinte, acestea se pot lega ntre ele folosind semnul "_". Lungimea maxim a numelui de predicat este de 250 caractere. n urmtorul exemplu, primul argument este o variabil anonim: lucreaza(_, biroul_aprovizionare) Mai trebuie precizat faptul c predicatele standard nu se definesc n aceast seciune, altfel, Visual Prolog avertizeaz printr-un mesaj de eroare: "... This name is reserved for a standard predicate (on the selected platform)"

n concluzie, predicatele trebuie declarate n seciunea de predicate, definite n seciunea de clauze, iar la apel, n funcie de numrul i tipul argumentelor se va alege definiia corespunztoare. n seciunea domains se poate realiza redenumirea unor domenii standard pentru a le da o semantic mai precis, precum i declararea unor noi structuri de date. Domeniile de baz au fost prezentate la nceputul acestei lucrri (char, integer, real, string, symbol). Seciunile domains i predicates pot fi declarate globale, astfel: global domains global predicates Odat scrise definiiile, ele pot fi incluse n unul sau mai multe programe cu: include nume_fis O alt seciune este databases, care reprezint o seciune special pentru declararea unor fapte care se doresc a fi o parte a unei baze de date dinamice. Astfel, uneori este necesar actualizarea faptelor din program (modificare, tergere, adugare) n timpul rulrii programului. ntr-un astfel de caz, faptele constituie o baz de date dinamic sau intern. Visual Prolog pune la dispoziie mai multe predicate pentru gestiunea bazelor de date (assertz, asserta etc.). Mai trebuie menionat c i aceast seciune poate fi declarat global. Seciunea goal trebuie s apar n program - n acest caz fiind vorba despre varianta compilator, la rulare programul execut acest goal, caut prima soluie i nu afieaz variabilele interne de lucru (goal declarat). Cnd apare n program, n general, seciunea goal este dup seciunile predicates i clauses. Un program Visual Prolog poate conine doar o singur seciune goal. Seciunea goal conine o clauz sau un ir de clauze conectate logic (cu and i/sau or): goal complex (compus din mai multe subgoal-uri legate logic). Acest goal poate fi un predicat cu sau fr argumente, iar argumentele, dac apar, pot fi variabile (variabile anonime sau nu) sau obiecte. Acest goal se termin cu punct. Dndu-se fapte, reguli i unul sau mai multe goal-uri, pentru fiecare goal, Visual Prolog execut urmtoarele operaii: l caut printre fapte; dac nu-l gsete ca fapt, caut pentru el regula de deducie i verific condiiile regulii, considernd pe rnd variantele (dac exist); fiecare condiie devine un subgoal. Goal-ul este demonstrat dac toate subgoal-urile sunt demonstrate. Seciunea constants permite declararea unor constante (constante simbolice). Seciunea poate s apar oriunde n program, cu condiia s fie declarat constanta nainte de utilizarea ei. Constanta e vizibil n toate clauzele, dar valoarea constantei nu se poate modifica n timpul execuiei programului. Forma general: constants nume _constant=valoare n Visual Prolog sunt constante numele de obiecte (iruri de caractere) i numerele (ntregi sau reale). Relativ la numele constantei, se face precizarea c nu conteaz dac ea este declarat cu litere mici sau mari, spre deosebire de toate celelalte date din Visual Prolog. Astfel pi, Pi sau PI vor referi aceeai constant. Ca regul general se cere ca n seciunea de constante, constantele s fie declarate cu liter mare, dar n seciunea de clauze, acestea trebuie s fie scrise cu liter mic, pentru a se distinge de variabile. Valoare poate fi orice obiect, de orice tip definit. Exemple: constants

Titlu="SALARII LUNARE" Expr=l+7*(47-12) Pi=3.14 G=9,8 Computer=mcintosh Se mai precizeaz faptul c pentru constante nu sunt permise definiii recursive, de exemplu x = 2 * x / 2. ntr-un program pot fi mai multe seciuni de declaraii pentru constante, dar constantele trebuie s fie declarate nainte de a fi utilizate. Constantele declarate au durata de via ncepnd din momentul declaraiei pn la sfritul fiierului surs, precum i n orice fiier inclus dup declaraii. De asemenea, se prezint comentariul, folosit pentru o mai mare claritate a programului. Simbolul "%" introduce un comentariu care se termin la sfritul liniei. Un text considerat comentariu i care ocup mai multe linii se va include ntre caracterele /* i */. Exemplu: /*********************************************************/ /* Sisteme expert */ /*********************************************************/ Exemple de reguli: n continuare sunt prezentate o serie de reguli, precum i implementarea lor n Visual Prolog: 1. "Dac o persoan (X) are sex masculin i este adult, atunci X este un brbat." - n acest caz premisa este o clauz compus, format din dou clauze simple asociate prin conectorul "i". barbat(X):- sex_masculin(X), adult(X). 2. Noiunea de printe poate fi definit astfel: parinte(X, Y):- tata(X, Y); mama(X, Y) Deoarece Prolog permite i utilizarea variabilelor anonime, noiunea de printe poate fi formulat astfel: parinte(X, _):- tata(X, _); mama(X, _) care are urmtoarea interpretare: "o persoan este printe dac este fie tatl, fie mama cuiva". Tema 1 : Se va urmri programul masini.pro, n care s-a declarat o baz de date pentru o firm care se ocup cu vnzarea mainilor. predicates %marca, km, vechimea, culoarea nondeterm masina(symbol,real,integer,symbol) nondeterm camion(symbol,real,integer,symbol) clauses masina(chrysler, 130000, 3, rosu). masina(ford, 90000, 4, argintiu). masina(datsun, 8000, 1, rosu). camion(ford, 80000, 6, verde). camion(datsun, 50000, 5, roz). camion(toyota, 25000, 2, negru). Tema 2 : Se va rula aplicatia si se vor specifica la goal, urmatoarele: Pentru a determina masina cu 130000 km si 3 ani vechime: masina(X,

130000, 3, _) Pentru a determina toate masinile rosii: masina(X, _, _, rosu) Tema3: Se va urmri programul bunici.pro: predicates nondeterm masc(symbol) nondeterm fem(symbol) nondeterm parinte(symbol, symbol) % primul este parintele pentru al doilea nondeterm mama(symbol, symbol) nondeterm bunica(symbol, symbol) clauses masc(vasile). masc(alex). fem(elena). fem(ioana). parinte(vasile, alex). parinte(elena, alex). parinte(alex, ioana). mama(Persoana, Copil) if parinte(Persoana, Copil) and fem(Persoana). bunica(Bunica, Nepot) if parinte(Persoana, Nepot) and mama(Bunica, Persoana). Se face observaia c o variant a ultimei reguli este: bunica(Bunica, Nepot) if parinte(Persoana, Nepot) and parinte(Bunica, Persoana) and fem(Bunica). Tema 4: Se va nota rspunsul primit n cazul urmtoarelor scopuri : parinte(elena, alex) yes parinte(Parinte, alex) Parinte=vasile Parinte=elena 2 Solutions mama(Parinte, alex) Parinte=elena 1 Solution bunica(Bunica, ioana) Bunica=elena 1 Solution parinte(Tata, Copil) and masc(Tata) Tata=vasile, Copil=alex Tata=alex, Copil=ioana 2 Solutions Tema 5: Adugai noi fapte n program pentru a exprima urmtoarele: Prinii lui Vasile sunt Gheorghe i Maria.

predicates nondeterm masc(symbol) nondeterm fem(symbol) nondeterm parinte(symbol, symbol) % primul este parintele pentru al doilea nondeterm mama(symbol, symbol) nondeterm bunica(symbol, symbol) clauses masc(vasile). masc(alex). masc(gheorghe). fem(elena). fem(ioana). fem(maria). parinte(vasile, alex). parinte(elena, alex). parinte(alex, ioana). parinte(gheorghe,vasile). parinte(maria,vasile). mama(Persoana, Copil) if parinte(Persoana, Copil) and fem(Persoana). bunica(Bunica, Nepot) if parinte(Persoana, Nepot) and mama(Bunica, Persoana). goal parinte(Tata, vasile) and masc(Tata), parinte(Mama, vasile) and fem(Mama). Prinii Ioanei sunt Alex i Sanda. predicates nondeterm masc(symbol) nondeterm fem(symbol) nondeterm parinte(symbol, symbol) % primul este parintele pentru al doilea nondeterm mama(symbol, symbol) nondeterm bunica(symbol, symbol) clauses masc(vasile). masc(alex). masc(gheorghe). fem(elena). fem(ioana). fem(sanda). parinte(vasile, alex). parinte(elena, alex). parinte(alex, ioana). parinte(sanda, ioana). mama(Persoana, Copil) if parinte(Persoana, Copil) and fem(Persoana). bunica(Bunica, Nepot) if

parinte(Persoana, Nepot) and mama(Bunica, Persoana). goal parinte(Tata, ioana) and masc(Tata), parinte(Mama, ioana) and fem(Mama). Cuvintul cheie nondeterm specific faptul c la un moment dat pot exista mai multe instane ale unui fapt fact_N. Cuvintul cheie determ specific faptul c la un moment dat poate exista o singur instan a unui fapt fact_N. Se consider fiierul tata.pro: domains pers=symbol predicates nondeterm tata(pers) nondeterm tata(pers, pers) clauses tata(X) if tata(X, _). tata(alex). tata(ion, vasile). tata(george, ana). goal tata(X), write(X). Tema 6 : Rulati programul tata.pro si explicati rezultatul rularii. ionX=ion georgeX=george alexX=alex 3 Solutions Observaii 1. S-a declarat un predicat cu ariti diferite, cu urmtoarea semantic intuitiv: - tata (pers) - nseamn c pers este tat (al cuiva); - tata(pers1, pers2) - nseamn c pers1 este tatl lui pers2 (s-a notat pers1 i pers2 pentru a se putea face distincia). 2. S-a redenumit domeniul standard symbol pentru a se sugera c argumentele vor fi persoane. 3. Scopul intern tata(X) se va evalua folosind prima clauz.

S-ar putea să vă placă și