Sunteți pe pagina 1din 11

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 2

Seciunile de baz ale unui program Turbo Prolog


n general, un program T.Pro. include trei sau patru seciuni de baz. Acestea sunt seciunile clauses, predicates, domains i uneori goal (cnd se genereaz un program executabil de sine-stttor). 1. Seciunea clauses conine descrierea tuturor faptelor i regulilor cu care va opera T.Pro. 2. Seciunea predicates conine declaraiile predicatelor cu care se opereaz i a tipurilor argumentelor acestora. 3. Seciunea domains conine declaraiile domeniilor (tipurilor) care se utilizeaz i care nu sunt domenii standard. 4. Seciunea goal conine ntrebarea (goal) care se adreseaz T.Pro., pentru a se putea crea un program executabil.

1. Seciunea clauses
n aceast seciune se scriu faptele i regulile ce se vor folosi. Majoritatea discuiei din textele anterioare s-a purtat n jurul clauzelor, construciei lor, utilizrii lor s.a.

2. Seciunea predicates
Dac v definii propriile predicate n seciunea clauses, va trebui s le declarai ntr-o seciune predicates, altfel T.Pro. nu va ti despre ce este vorba. Evident, nu va trebui s declarai predicatele predefinite. Seciunea predicates listeaz pur i simplu fiecare predicat, cu tipurile (domeniile) argumentelor. Cum se declar predicatele utilizator O declarare de predicat ncepe cu numele predicatelor, urmat, ntre paranteze rotunde, de tipurile argumentelor, separate de virgul: numepredicat(tip_arg_1, tip_arg_2, ..., tip_arg_n) O declaraie de predicat NU este terminat de punct. Numele predicatelor Numele unui predicat trebuie s nceap cu o liter, urmat de o secven de litere, cifre i caractere _. Tipul primei litere nu conteaz, dar se recomand utilizarea literelor mici. Argumentele predicatelor Argumentele prodicatelor trebuie s aparin unor domenii cunosute de T.Pro. Un domeniu poate fi domeniu standard, sau unul declarat de Dvs. n seciunea domains. 1

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 2

Exemple: 1. Dac declarai predicatul my_predicate(symbol, integer) n seciunea predicates predicates my_predicate(symbol, integer) nu trebuie s-i declarai domeniile argumentelor n seciunea domains, deoarece symbol i integer sunt domenii standard. Dar, dac declarai: predicates my_predicate(name, number) va trebui s declarai name(un symbol) i number (un integer): domains name = symbol number = integer predicates my_predicate(name, number) 2. Urmtorul extras de program T.Pro. arat mai multe declaraii de domenii i predicate: domains person, activity = symbol car, make, color = symbol mileage, years_on_road, cost = integer predicates likes(person, activity) parent(person, person) can_buy(person, car) car(make, mileage, years_on_road, collor, cost) green(symbol) ranking(symbol, integer) Ce este o potrivire a argumentelor predicatelor identice ? Iat cteva reguli ce vor explica termenul potrivire: 1) Structuri identice se potrivesc una cu alta parinte(joe, tammy) se potriveste cu parinte(joe, tammy) 2) De obicei o potrivire implic variabile libere. Daca X e libera, parinte(joe, X) se potriveste cu parinte(joe, tammy) 2

Inteligen Artificial PROLOG iar X este legat la tammy.

Lucrarea de laborator nr. 2

3) Daca X este legat, se comport ca o constant. Cu X legat la tammy, parinte(joe, X) parinte(joe, X) se potriveste cu NU se potriveste cu parinte(joe, tammy) parinte(joe, millie)

4) Doua variabile libere se potrivesc una cu alta parinte(joe, X) se potriveste cu parinte(joe, Y) Aritate multipl Aritatea unui predicat este numrul de argumente pe care le accept. Putei avea dou predicate cu acelai nume dar cu ariti diferite. Trebuie s grupai predicatele cu acelai nume mpreun att n seciunea predicates ct i n seciunea clauses. Predicatele cu acelai nume dar cu ariti diferite sunt tratate ca predicate complet diferite. Iat un exemplu: domains person = symbol predicates father(person) father(person, person) clauses father(Man) if father(Man, _). father(pavel,rozalia). father(vasile,ion).

3. Seciunea domains
Domeniile n Prolog sunt ca tipurile n Pascal. Seciunea domanis are dou scopuri utile. nti, putei da nume semnificative unor domenii, chiar dac intern acestea sunt echivalente cu domenii care exist deja. Apoi, declaraiile de domenii speciale sunt utile pentru a construi noi structuri de date, nedefinite de domeniile standard. Domenii predefinite char caracter inclus ntre '' (de exemplu, 'a') integer ntreg ntre -32768 i 32767 real real ntre 1e-307 i 1e+308. Numerele reale sunt date n formatul {+|-} DDDD {.} DDDD {e {+|-} DDD} string secvena de caractere ntre "" (de ex. "ir de caractere") symbol 1. secvena de litere, cifre i underline ce ncepe cu liter mic (de ex. ir_de_caractere) 2. secven de caractere ntre "" (de ex. "ir de caractere") 3

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 2

Observaii: 1. Symbol-urile si string-urile sunt interschimbabile, dar T.Pro. le memoreaz diferit. Symbolurile sunt memorate ntr-o tabel de pointeri la adresele lor, lucru care permite o regsire rapid a informaiilor, dar exist 2 dezavantaje: - tabela de simboluri ocup memorie mult; - se pierde timp cu introducerea simbolurilor n tabel; String-urile sunt memorate separat. 2. ntr-un domeniu de tip string sau char apariia caracterului \ are o semnificatie special: combinatia \nr este caracterul ASCII corespunztor lui nr, nr e cuprins ntre 0 i 255. De exemplu: '\n' - new line '\t' - tabulator 3. Anumite predicate pot fi declarate cu diverse tipuri de domenii. n aceste cazuri, predicatele respective trebuie s[ apar n linii succesive, pe fiecare linie se descrie domeniul corespunztor. De exemplu: ......... add(x,y,z) add(integer, integer, integer) add(real, real, real) Exemple: 1. Fie secvena: domains name, sex = symbol age = integer predicates person(name, sex, age) Unul din avantajele principale este c T.Pro. poate prinde erorile de tip de genul: same_sex (X, Y) if person(X, Sex, _), person(Sex, Y, _). Chiar dac name si sex sunt definite ca symbol, totui ele nu sunt echivalente. 2. Fie programul: domains suma, prod = integer predicates adun(suma, suma, suma) produs(prod, prod, prod) clauses adun(X, Y, Z) if Z = X + Y. produs(X, Y, Z) if 4

Inteligen Artificial PROLOG Z = X * Y. Testai cele 2 cazuri de mai jos n seciunea Goal: 1. 2. adun(32, 54, Sum). produs(31, 13, Produs). produs(31, 17, Sum), adun(Sum, Sum, Raspuns).

Lucrarea de laborator nr. 2

4. Seciunea goal
Pan acum, am introdus ntrebri la prompterul Goal: din Dialog window. Acestea se numesc ntrebri externe (external goals). ntrebrile externe se folosesc cnd dorii s executai programele din interiorul mediului T.Pro. Dac dorii s compilai programul, va trebui s introducei seciunea goal. ntrebrile date aici se numesc ntrebri interne (internal goals). Esenialmente, seciunea goal arat ca definiia unei clauze: o list de subclauze (cereri), cu deosebirea c dup cuvntul goal nu se pune ':-'. O deosebire fundamental ntre ntrebrile interne i cele externe este c T.Pro. rspunde la ntrebrile externe cu toate soluiile, iar la ntrebrile interne doar cu prima soluie. Iat un exemplu: predicates run(char) r(char) goal run(X). clauses r('m'). r('n'). run(X):- r(X),write(X). Rulai programul n mai multe moduri i observai modificrile existente la afiarea soluiilor: - aa cum este scris mai sus; - far seciunea goal; - far argumente la predicatul run. Cum se satisfac cererile n Prolog? Din punct de vedere semantic, cererile n TProlog sunt tratate n dou faze: a) faza de unificare a cererii b) faza de control a cererii 5

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 2

a) Faza de unificare - corespunde transferului de parametri din C, Pascal etc; - este "o instaniere" adic o punere n coresponden a parametrilor cererii cu parametrii clauzelor. S considerm exemplul de mai jos: domains titlu,autor = symbol pagini=integer publicatie=carte(titlu,pagini) predicates scris_de(autor,publicatie) carte_vasta(publicatie) De ce nu apare carte(titlu, Dimensiune)? clauses scris_de(fleming, carte("Dr. No",210)). scris_de(caragiale, carte("O noapte furtunoas", 409)). carte_vast(carte(Titlu, Dimensiune)):scris_de(_, carte(Titlu, Dimensiune)),Dimensiune>300. a) pentru scopul: scris_de(X,Y) - Prologul va ncerca s satisfac cererea i verific fiecare clauz i obine: X=fleming, Y=carte("Dr. No", 210) X=caragiale, Y=carte("O noapte furtunoas", 409) 2 solutions b) pentru scopul: scris_de(X, carte("O noapte furtunoasa", Y) - Prologul va ncerca s satisfac cererea unificnd variabilele i constantele din cerere cu cele din prima clauz. Constantele difer, deci scopul eueaz. n schimb pentru a doua clauz se potrivesc i atunci se obine: X=caragiale, Y=409 1 solution Din analiza acestui exemplu se desprind dou concluzii: - unificarea unei variabile libere se poate realiza cu orice termen, variabila fiind instaniat cu termenul respectiv; - o constant poate fi unificat cu ea nsi sau cu o variabil liber. b) Faza de control - S considerm exemplul: domains nume, obiect = symbol predicates place(nume,obiect) citete(nume) 6

Inteligen Artificial PROLOG este_captivat(nume) clauses place(ion, vin). place(maria,schi). place(Z, carte):- citete(Z), este_captivat(Z). place(maria, carte). place(maria, film). citeste(ion). este_captivat(ion). Considerm cererea: place(X,vin), place(X,carte).

Lucrarea de laborator nr. 2

Prologul o va descompune n dou subcereri i va ncerca satisfacerea lor repectnd urmatoarele reguli: R1. Subcererile se satisfac de la stnga la dreapta. R2. Clauzele predicatului corespunztor subcererii se parcurg secvenial n baza de fapte a Prologului. R3. Dac o cerere corespunde membrului stng al unei reguli atunci membrul drept trebuie satisfcut efectundu-se unificarea corespunztoare. R4. O cerere e satisfacut dac se determin cte un fapt din baza de fapte pentru fiecare extremitate (frunz) din arborele respectiv. Pentru exemplul considerat vom avea: place(X,vin),place(X,carte)

R1.

place(X,vin) place(ion,vin) place(Z,carte)

R2. R3.

place(X,carte) place(Z,carte) este_captivat(Z)

citeste(Z) place(ion,carte) Deci soluia va fi: X=ion. Tema 4

R1. citeste(ion) este_captivat(ion)

Verificai regulile enunate mai sus i reprezentai sub form de arbore ca n exemplul de mai sus modalitatea de obinere a soluiei problemei: domains nume = symbol predicates sef(nume,nume) 7

Inteligen Artificial PROLOG clauses sef(ion, vasile). sef(petru, ion). sef(ana,maria). sef(maria,vasile). Consideram cererea: ef (ana,X) , ef (X,vasile)

Lucrarea de laborator nr. 2

Sintaxa regulilor Regulile sunt folosite n Prolog cnd un fapt depinde de succesul (veridicitatea) altor fapte sau succesiuni de fapte. O regul Prolog are trei pri: capul, corpul i simbolul if (:-) care le separ pe primele dou. Iat sintaxa generic a unei reguli T.Pro.: CAP :subgoal, subgoal, ..., subgoal. Corpul regulii, care urmeaz dup cap i simbolul if, const din unul sau mai multe subgoal-uri. Subgoalurile sunt separate de virgule (and), i ultimul subgoal dintr-o regul este terminat de un punct. Fiecare subgoal este un apel la un alt predicat Prolog. Cnd programul face acest apel, T.Pro. testeaz predicatul apelat s vad dac poate fi adevrat. Odat ce subgoal-ul curent a fost satisfcut (a fost gsit adevrat), se revine i procesul continu cu urmtorul subgoal. Dac procesul a ajuns cu succes la punct, regula a reusit. Pentru a utiliza cu succes o regul, Prolog trebuie s satisfac toate subgoal-urile ei, crend o mulime consistent de legri de variabile. Dac un subgoal eueaz (este gsit fals), procesul revine la subgoal-ul anterior i caut alte legri de variabile, i apoi continu. Acest mecanism se numete backtracking. Not n programele Prolog, cuvantul if se poate schimba cu :- (dou-puncte liniua) cuvntul and se poate schimba cu , (virgula) iar cuvantul or se poate scimba cu ; (punct-virgula). De exemplu, urmtoarele dou secvene de cod sunt echivalente: e_mai_batran (P1, P2) if varsta(P1, V1) and varsta(P2, V2) or V1 > V2. e_mai_batran(P1, P2) :varsta(P1, V1), varsta(P2, V2); V1 > V2.

Inteligen Artificial PROLOG Simbolul IF din Prolog i IF din alte limbaje

Lucrarea de laborator nr. 2

n Pascal condiia coninut n instruciunea IF sun astfel: dac CAP-ul este adevarat atunci CORP-ul este adevarat (sau atunci executa CORP-ul) Acest tip de instruciune este cunoscut sub numele de condiionala if/then. Prolog folosete o alt form a logicii n regulile lui: CAP-ul este adevrat dac CORP-ul este adevrat (sau dac CORP-ul poate fi realizat) Astfel, o regul Prolog este de forma unei condiionale then/if. Conversii de tip automate Cnd T.Pro. potrivete dou variabile, nu este ntotdeauna necesar ca acestea s aparin unui acelai domeniu. Deasemenea, uneori variabilele pot fi legate de constante din alte domenii. Aceste combinaii sunt permise deoarece T.Pro. realizeaz conversii automate de tip n urmtoarele condiii: - ntre domeniile string i symbol. - ntre domeniile integer, char i real. (Cnd un caracter este convertit la o valoare numeric, numrul este valoarea ASCII a acelui caracter.) Un argument dintr-un domeniu definit astfel: domains domeniu = <domeniu-de-baz> poate fi combinat n mod liber cu argumente din acel domeniu de baz i cu toate domeniile standard compatibile cu acel domeniu de baz. Aceasta nseamn c, de exemplu, putei: - apela un predicat ce manevreaz string-uri cu un argument de tip symbol; - apela un predicat ce manevreaz reali cu un argument ntreg; - apela un predicat ce manevreaz caractere cu valori ntregi; - folosi caractere n expresii i comparaii fr a trebui s cutai valorile lor ASCII.

Alte seciuni de program


Seciunea database Un program T.Pro. este o colecie de fapte i reguli. Uneori, n timpul execuiei unui program, ai putea dori s actualizai (s schimbai, tergei sau aduga) unele fapte cu care programul opereaz. ntr-un astfel de caz faptele constituie o baz de date dinamic sau intern; se poate schimba n timpul execuiei programului. T.Pro. include o seciune special pentru declararea faptelor din program care trebuie s fie parte dintr-o baz de date dinamic; aceasta este seciunea database. Seciunea database se declar cu cuvntul rezervat database. Aici declarai faptele ce trebuie incluse ntro baz de date dinamic. T.Pro. ofer un numr de predicate predefinite pentru manevrarea unei baze de date dinamice. 9

Inteligen Artificial PROLOG O discuie complet a acestui aspect se va face n viitor. Seciunea constants

Lucrarea de laborator nr. 2

n programul T.Pro. putei declara i folosi constante simbolice. O seciune pentru declararea constantelor este indicat de cuvntul rezervat constants urmat de declaraiile propriu-zise, folosind sintaxa: <identificator> = <macrodefiniie> <identificator> este numele constantei simbolice, iar <macrodefiniie> este ceea ce atribuii acelei constante. Poate s apar o singur declaraie pe linie. Constantele declarate n acest fel pot fi referite mai trziu n program. Iat un exemplu: constants zero = 0 unu = 1 doi = 2 o_sut = (10 * (10 - 1) + 10) pi = 3.141592653 ega = 3 nainte s compileze programul, T.Pro. va nlocui fiecare apariie a constantelor simbolice cu valoarea lor (luat ca string). De exemplu, secvena: A = o_sut * 34, va fi nlocuit cu secvena: A = (10 * (10 - 1) + 10) * 34, Exist cteva restricii n utilizarea constantelor simbolice: definiia unei constante simbolice nu se poate referi la ea nsi: numar = 2 * numar / 2 pot fi mai multe seciuni constants ntr-un program, dar constantele trebuie s fie mai nti declarate i abia apoi folosite. n seciunea constants sistemul nu face diferena ntre literele mari i mici n declaraia constantelor simbolice. Exemplu: este asemntor cu cel de mai sus dar am utilizat i o constant. constants Trei=3 domains s,p=integer predicates ad(s,s,s) 10

Inteligen Artificial PROLOG pr(p,p,p) clauses ad(X,Y,Z):-Z=X+Y+trei. pr(X,Y,Z):-Z=X*Y.

Lucrarea de laborator nr. 2

Rulai programul aa i apoi n seciunea clauses scriei cifra 3 asa cum e scris n seciunea constants.

Directive de compilare
Directiva include La un moment dat vei considera c este natural s folosii unele proceduri de mai multe ori n mai multe programe pe care le scriei. Putei folosi directiva include pentru a economisi timp i pentru a nu fi nevoie s reintroducei codul respectiv. Iat cum putei folosi directiva include: 1. Creai un fisier, de exemplu DATE.PRO, n care v declarai predicatele frecvent folosite (folosind seciunile domains i predicates) i dai definiiile acestor predicate, ntr-o seciune clauses. 2. Scriei sursa programului ce va folosi aceste predicate. 3. La locul potrivit n sursa dvs., introducei linia include "date.pro" Prin loc potrivit se nelege orice loc unde putei plasa o seciune domains, predicates, clauses sau goal. 4. La compilare, T.Pro. va compila coninutul fiierului "date.pro" n poziia corect n cadrul produsului final compilat al textului surs.

Directivele trace si shorttrace Prin intermediul directivelor trace i shorttrace T.Pro. avei posibilitatea s v depanai programele. Putei plasa directivele trace sau shorttrace pe prima linie a textului programului. Iat efectul: trace: sistemul afieaz fiecare apel de predicat i fiecare revenire ce sunt pri logice ale execuiei programului. shorttrace: sistemul afieaz doar un subset al apelurilor i revenirilor, pe baza unor optimizri ale compilatorului.

11