Sunteți pe pagina 1din 9

Laborator 2 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 i. caracter - char: un caracter ncadrat ntre dou caractere apostrof; ii. ntreg - integer: ntreg cuprins n intervalul [-32768, 32767]; iii.real - real: numr real, echivalent cu double din C i al crui modul este n intervalul [1e-307, 1e308] iv. 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: iv.1. secven de litere, numere i liniu de subliniere, n care primul caracter este minuscul (de ex., numar_telefon); iv.2. secven de caractere ncadrat ntre ghilimele, maxim 250 caractere (de exemplu, sir de caractere); v. 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) vi. fiier - file: nume simbolic de fiier vii. numr de referin - ref: pentru termen dintr-o baz extern viii. selector de baz de date extern - db_selector: nume simbolic prin care se face referin la o baz extern de cunotine; acest nume simbolic este extern programului ix.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 x. domeniu - place: locul ocupat de un fiier xi.localizare b. definit de utilizator 2. complex a. lista i. de tipuri elementare ii. de tipuri compuse b. compus din: i. nume simbolic ii. diferite tipuri

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). 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. Alte seciuni vor fi prezentate mai trziu. 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". 3. "Dac tatl lui Z este Y, iar printele lui X este Z, atunci bunicul lui X este Y" - variabila sau variabilele cuprinse n concluzie trebuie s se regseasc i n premise, dar premisele pot conine i variabile suplimentare, care nu se regsesc n concluzie, aa cum se poate observa din implementare:
bunic(X, Y):- tata(Z, Y), parinte(X, Z).

Deoarece Prolog permite i utilizarea variabilelor anonime, noiunea de printe poate fi formulat astfel:
bunic(X, Y):- tata(_, Y), parinte(X, _).

Tem 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.
/* Visual Prolog */ 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). /* Se va rula aplicatia si se vor specifica la goal, urmatoarele: Pentru a determina masina cu 130000km si 3 ani vechime:

masina(X, 130000, 3, _) Pentru a determina toate masinile rosii: masina(X, _, _, rosu) */

2. Se va urmri programul bunici.pro:


/**************************************/ /* Program cu parinti, mame si bunici */ /**************************************/ 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).

Se va nota rspunsul primit n cazul urmtoarelor scopuri :


parinte(elena, alex) parinte(Parinte, alex) mama(Parinte, alex) bunica(Bunica, ioana) parinte(Tata, Copil) and masc(Tata)

Adugai noi fapte n program pentru a exprima urmtoarele: Prinii lui Vasile sunt Gheorghe i Maria. Prinii Ioanei sunt Alex i Sanda. 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.

Cuvintul cheie single specific faptul c ntotdeauna va exista o singur instan a unui fapt fact_N. Directive de compilare Dac se dorete s se urmreasc pas cu pas execuia unui program, atunci din meniul Project, se va alege opiunea Debug (Ctrl + Shift + F9). n continuare se consider directiva include, care este folosit atunci cnd se dorete concatenarea mai multor fiiere spre a fi executate n Visual Prolog. Trebuie specificat faptul c procedurile din fiierele incluse trebuie s fie declarate o singur dat i trebuie s existe cel mult o seciune goal. 3. 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 1. Rulati programul tata.pro */

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. Tema 1. S se modifice programul masini.pro, introducndu-se redenumirea domeniilor standard.

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

  • Practica Licenta: Teoria Circuitelor (Bazele Electrotehnicii I)
    Practica Licenta: Teoria Circuitelor (Bazele Electrotehnicii I)
    Document22 pagini
    Practica Licenta: Teoria Circuitelor (Bazele Electrotehnicii I)
    bolomei97
    Încă nu există evaluări
  • Doc
    Doc
    Document1 pagină
    Doc
    bolomei97
    Încă nu există evaluări
  • Doc
    Doc
    Document1 pagină
    Doc
    bolomei97
    Încă nu există evaluări
  • Documentatie
    Documentatie
    Document14 pagini
    Documentatie
    bolomei97
    Încă nu există evaluări
  • Raspunsuri 1 36
    Raspunsuri 1 36
    Document6 pagini
    Raspunsuri 1 36
    GeorgeAnton
    Încă nu există evaluări
  • Doc
    Doc
    Document1 pagină
    Doc
    bolomei97
    Încă nu există evaluări
  • Doc
    Doc
    Document1 pagină
    Doc
    bolomei97
    Încă nu există evaluări
  • Prezent Are
    Prezent Are
    Document5 pagini
    Prezent Are
    bolomei97
    Încă nu există evaluări
  • Traducere Articol
    Traducere Articol
    Document5 pagini
    Traducere Articol
    bolomei97
    Încă nu există evaluări
  • Cap 9
    Cap 9
    Document3 pagini
    Cap 9
    bolomei97
    Încă nu există evaluări
  • Traducere Articol
    Traducere Articol
    Document5 pagini
    Traducere Articol
    bolomei97
    Încă nu există evaluări
  • Cap 6
    Cap 6
    Document11 pagini
    Cap 6
    bolomei97
    Încă nu există evaluări
  • Cap 8
    Cap 8
    Document19 pagini
    Cap 8
    bolomei97
    Încă nu există evaluări
  • Cap 7
    Cap 7
    Document18 pagini
    Cap 7
    bolomei97
    Încă nu există evaluări
  • SISRINT3
    SISRINT3
    Document9 pagini
    SISRINT3
    bolomei97
    Încă nu există evaluări
  • SISRINT3
    SISRINT3
    Document9 pagini
    SISRINT3
    bolomei97
    Încă nu există evaluări