+ All Categories
Home > Documents > Folii Prolog

Folii Prolog

Date post: 30-May-2018
Category:
Upload: pastrama-emil
View: 240 times
Download: 0 times
Share this document with a friend

of 29

Transcript
  • 8/14/2019 Folii Prolog

    1/29

    Folii PrologPrelegerea 2 Pastram Emil1

    PROLOG

    Prolog reprezint o prescurtare de la Programming n logic. Este un limbaj conceput pentru programarea logic (deci un limbaj declarativ). A fost elaborat n cursul anilor 1970 n Europa (mai ales n Frana i Scoia). Primul compilator de Prolog a fost creat n 1972 de ctre Philippe Roussel, la

    Universitatea din Marsilia.

    Prologul este un limbaj compilat, care utilizeaz, n locul relaiilor matematice,relaii logice ntre mulimi de date.

    Exista limbaje algoritmice, orientate obiectsi logice. Limbajele programrii logice (Prolog) sunt limbaje declarative. Un limbaj de

    programare declarativ scutete programatorul de a mai meniona procedura exact

    pe care trebuie s o execute calculatorulpentru a realiza o funcie. Programatorii

    folosesc limbajul pentru a descrie o mulime de fapte i de relaii astfel nct

    utilizatorul s poat interogaapoi sistemul pentru a obine un anumit rezultat.

    - Programele Prolog opereaza cu obiecte si cu relatii intre obiecte (fapte si/sauclauze).

    - Negatia joaca un rol foarte important in programarea in acest limbaj, deoareceorice proprietate care nu se poate deduce din entitatile programului este

    considerata falsa, deci negatia ei este adevarata.

    - Prolog foloseste un model de rationament minimal numit ipoteza lumii inchise.Conform acestui model, tot ceea ce nu este stiut de program, deci afirmat explicit

    ca fiind adevarat in program, este considerat fals.

    - Prologul modeleaza negatia ca esec al satisfacerii unui scop (negatia ca insucces),aceasta fiind de fapt o particularizare a ipotezei lumii inchise.

    O clauza Prolog sau regula este de forma:H :- B1, B2, , Bn.

    unde: H este capul regulii, iar membrul drept constituie corpul regulii (care este o

    conjunctie sau o disjunctie de scopuri).

    Sensul clauzei Prolog anterioare este:

  • 8/14/2019 Folii Prolog

    2/29

    Folii PrologPrelegerea 2 Pastram Emil2

    If B1 & B2 & & Bn then H

    In Prolog constantele se scriu cu litera mica, iar variabilele cu litera mare. Simbol..Sens

    :- daca

    , conjunctie

    ; disjunctie

    _ variabila universala

    (semnifica orice)

    O fapta Prolog este o clauza fara corp, adica de forma H. Ea reprezinta o clauzacare este tot timpul adevarata, deoarece nu este conditionata.

    Structura unui program Prolog: definitii constante tipuri de obiecte definite de utilizator declaratiile predicatelor reguli Un program Prolog contine urmatoarele entitati:

    fapte despre obiecte si relatiile existente intre aceste obiecte; reguli despre obiecte si relatiile dintre ele, care permit deducerea

    (inferarea) de noi fapte pe baza celor cunoscute;

    intrebari, numite si scopuri, despre obiecte si relatiile dintre ele, la careprogramul raspunde pe baza faptelor si regulilor existente.

    Baza de cunostinte Prolog:Multimea faptelorunui program Prolog formeaza baza de cunostinte Prolog. In

    baza de cunostinte a unui program Prolog sunt incluse si regulile Prolog.

    Scopuri:Scopurile sunt predicate pentru care se doreste aflarea valorii de adevar, in

    contextul faptelor existente in baza de cunostinte.

    Rezultatul unui program Prolog:Obtinerea consecintelor sau a rezultatului unui program Prolog se face prin

    fixarea unor scopuri care pot fi adevarate sau false, in functie de continutul bazei

  • 8/14/2019 Folii Prolog

    3/29

    Folii PrologPrelegerea 2 Pastram Emil3

    de cunostinte. Cum scopurile pot fi vazute ca intrebari, rezultatul unui program

    Prolog este raspunsul la o intrebare sau la o conjunctie de intrebari.

    O regula Prolog exprima un fapt care depinde de alte fapte si este de formaS :- S1, S2, , Sn.

    cu S reprezentand capul sau antetul regulii, iar membrul drept reprezentand corpul

    regulii.

    Constantele se mai numesc atomi simbolici si denumirile lor incep cu litera mica. Numele de variabile incep cu litera mare; o variabila poate fi instantiata sau

    legata daca exista un obiect asociat acestei variabile sau neinstantiata, respectiv

    nelegata, respectiv libera daca nu se stie inca ce obiect va desemna variabila.

    La fixarea unui scop Prolog care contine variabile, acestea sunt neinstantiate, iarsistemul incearca satisfacerea acestui scop cautand printre faptele din baza de

    cunostinte un fapt care poate identifica cu scopul, printr-o instantiere adecvata a

    variabilelor din scopul dat. Este vorba de fapt de un proces de unificare a

    predicatului scop cu unul din predicatele fapte existente in baza de cunostinte. La

    incercarea de satisfacere a scopului, cautarea se face intotdeauna pornind de la

    inceputul bazei de cunostinte. Exista atatea solutii cate unificari diferite exista.

    Obtinerea primei solutii este numita satisfacerea scopului, iar obtinerea altor

    solutii resatisfacerea scopului. La satisfacerea unui scop cautarea se faceintotdeauna de la inceputul bazei de cunostinte. La resatisfacerea unui scop

    cautarea se face incepand de la marcajul stabilit de satisfacerea anterioara a acelui

    scop.

    Obtinerea solutiilor atunci cand baza de cunostinte Prolog contine si reguli:

    In acest caz, unificarea scopului se incearca atat cu fapte din baza de cunostinte,

    cat si cu antetul regulilor din baza.

    La unificarea unui scop cu antetul unei reguli, pentru a putea satisface acest scop

    trebuie satisfacuta regula. Aceasta revine la a satisface toate faptele din corpul regulii,

    deci conjunctia de scopuri. Scopurile din corpul regulii devin subscopuri a caror

    satisfacere se va incerca printr-un mecanism similar cu cel al satisfacerii scopului initial.

  • 8/14/2019 Folii Prolog

    4/29

    Folii PrologPrelegerea 2 Pastram Emil4

    Comportarea sistemului Prolog in care se incearca in mod repetat satisfacerea si

    resatisfacerea scopurilor din conjunctia de scopuri se numeste backtracking.

    Un exemplu de program Prolog (definirea unor relatii de familie):

    - faptul ca Tom este parinte al lui Bob se poate scrie in Prolog astfel:parinte(tom, bob).

    Aiciparinte este numele relatiei, iar tom si bob sunt argumentele sale.

    Program Prolog care defineste relatii de familie:parinte(pam, bob).

    parinte(tom, bob).

    parinte(tom, liz).

    parinte(bob, ann).

    parinte(bob, pat).

    parinte(pat, jim).

    Programul consta din 6 clauze. Fiecare dintre aceste clauze declara un fapt despre

    relatia parinte. Spre exemplu, parinte(tom, bob) este o instantiere particulara a relatiei

    parinte. In general, o relatie se defineste ca fiind multimea tuturor instantierilor sale.

    Obs.: Acest program simplu nu contine (inca) regului (ci doar fapte).

    Interogarea Prologului:

    Ex.: Vrem sa aflam daca Bob este parinte al lui Pat. Aceasta intrebare este comunicata

    sistemului Prolog tastandu-se la terminal:

    ?- parinte(bob, pat).

    Raspunsul Prologului va fi

    yes

    Alte exemple de interogari:

    ?-parinte(liz, pat).

    no

  • 8/14/2019 Folii Prolog

    5/29

    Folii PrologPrelegerea 2 Pastram Emil5

    ?-parinte (tom, ben).

    no

    Cine este parintele lui Liz?

    ?-parinte(X, liz).

    X = tom

    Cine sunt copiii lui Bob??-parinte (bob, X).

    X = ann;

    X= pat;

    no

    Cine este parinte al cui??-parinte(X, Y).

    X = pam

    Y = bob;

    X = tom

    Y = bob;

    X = tom

    Y = liz;

    Cine este un bunic al lui Jim? i.e.(1) Cine este parinte al lui Jim? Presupunem ca acesta este un Y.(2) Cine este parinte al lui Y? Presupunem ca acesta este un X.(1) si (2) necesita urmatoarea interogare compusa:?- parinte(Y, jim), parinte(X, Y).

  • 8/14/2019 Folii Prolog

    6/29

    Folii PrologPrelegerea 2 Pastram Emil6

    Raspunsul Prologului este:

    X = bob

    Y = pat

    Obs.: Interogarea

    ?- parinte(X, Y), parinte(Y, jim).

    va produce acelasi rezultat.

    Cine sunt nepotii lui Tom??- parinte(tom, X), parinte (X, Y).

    X = bob

    Y = ann;

    X = bob

    Y = pat

    Ann si Pat au un parinte comun??-parinte(X, ann), parinte(X, pat).

    X = bob

    Extinderea programului cu reguli:

    Introducem, mai intai, urmatoarele fapte noi:feminin(pam).

    masculin(tom).

    masculin(bob).

    feminin(liz).

    feminin(pat).feminin(ann).

    masculin(jim).

    si

    sex(pam, feminin).

    sex(tom, masculin).

  • 8/14/2019 Folii Prolog

    7/29

    Folii PrologPrelegerea 2 Pastram Emil7

    sex(bob, masculin).

    si

    urmas(liz, tom).

    Obs.: Relatia urmas poate fi definita intr-un mod mult mai elegant prin folosirea

    relatiei deja definiteparinte.

    Pentru toti X si toti Y,

    Y este urmas al lui X daca

    X este parinte al lui Y.

    Aceasta interpretare genereaza o clauza Prolog reprezentata de urmatoarea regula:urmas(Y, X) :- parinte(X, Y).

    Interogarea Prologului cand baza de cunostinte contine si aceasta regula:?- urmas(liz, tom).

    Cum lucreaza Prologul acum: Intrucat nu exista fapte referitoare la urmasi, trebuiefolosita regula, astfel: variabilele X si Y vor fi instantiate in felul urmator

    X = tom si Y = liz

    Continuare:

    - Dupa instantiere se obtine un caz particular al regulii generale. Acest cazparticular este:

    urmas(liz, tom) :- parinte(tom, liz).

    - Corpul regulii reprezinta partea de conditie, iar antetul ei partea de concluzie.Prolog incearca sa determine daca partea de conditie este adevarata i.e. daca

    parinte(tom, liz) este adevarat. In acest moment, scopul initial, urmas(liz,tom), a

    fost inlocuit cu subscopul parinte(tom, liz).

    - Noul scop este imediat satisfacut intrucat el reprezinta o fapta Prolog (din baza decunostinte).

    - Aceasta inseamna ca partea de concluzie este, de asemenea, adevarata, iar Prologva raspunde la intrebare cu yes.

  • 8/14/2019 Folii Prolog

    8/29

    Folii PrologPrelegerea 3 Pastram Emil1

    Introducem acum relatii de familie suplimentare: relatia mama, definita astfel:mama (X, Y) :- parinte (X,Y), feminin (X).

    relatia bunic, definita astfel:bunic (X, Z) :- parinte (X, Y), parinte(Y, Z).

    relatia sora, definita astfel:sora (X, Y) :-

    parinte (Z, X),

    parinte (Z, Y),

    feminin (X).

    Interogarea Prologului: daca ann si pat sunt surori

    ?- sora (ann, pat).

    yes

    cine este sora lui Pat?- sora (X, pat).

    X = ann;

    X = pat

    Obs.: Relatia sora ar trebui sa fie definita dupa cum urmeaza

    sora (X, Y) :-

    parinte (Z, X),

    parinte (Z, Y),

    feminin (X),

    diferit (X, Y).

    unde predicatul diferit (X,Y) trebuie definit astfel incat el sa fie satisfacut daca si numai

    daca X e diferit de Y.

    Reguli recursive

    relatiapredecesor: un predecesor poate fi direct(parinte)predecesor (X, Z) :- parinte (X, Z).

  • 8/14/2019 Folii Prolog

    9/29

    Folii PrologPrelegerea 3 Pastram Emil2

    sau indirect

    predecesor (X, Z) :-

    parinte (X, Y),

    parinte (Y, Z).

    predecesor (X, Z):-

    parinte (X, Y1),

    parinte (Y1, Y2),

    parinte(Y2, Z).

    OBS.: Pentru ca relatiapredecesorsa lucreze corect in cazul predecesorilor aflati la orice

    adancime, definitia ei trebuie gandita in felul urmator:

    Pentru toti X si Z,X este predecesor al lui Z daca

    Exista un Y astfel incat

    (1) X este parinte al lui Y si(2) Y este un predecesor al lui Z.

    Clauza Prolog corespunzatoare (recursiva) este:

    Predecesor (X,Z) :-

    parinte (X,Y),

    predecesor (Y,Z).

    Definirea relatiei predecesor:- consta din doua reguli, una care se refera la predecesori directi si cealalta la

    predecesori indirecti. Definitia completa este urmatoarea:

    predecesor (X, Z) :-

    parinte (X,Z).

    predecesor (X, Z) :-

    parinte (X, Y),

    predecesor (Y, Z).

  • 8/14/2019 Folii Prolog

    10/29

    Folii PrologPrelegerea 3 Pastram Emil3

    Exemplu de interogare a Prologului (care sunt succesorii lui Pam):

    ?- predecesor (pam, X).

    X = bob;

    X = ann;

    X = pat;

    X = jim

    Semnificatia declarativa si procedurala a programelor Prolog

    Semnificatia declarativa a unui program Prolog se refera la interpretarea strict

    logica a clauzelor acelui program, rezultatul programului fiind reprezentat de toate

    consecintele logice ale acestuia. Semnificatia declarativa determina daca un scop este

    adevarat (poate fi satisfacut) si, in acest caz, pentru ce instante de variabile este adevaratscopul.

    Semnificatia procedurala a unui program Prolog se refera la modul in care

    sistemul incearca satisfacerea scopurilor, deci la strategia de control utilizata.

    Diferenta dintre semnificatia declarativa si cea procedurala este aceea ca cea de-a

    doua defineste, pe langa relatiile logice specificate de program, si ordinea de satisfacere

    a scopurilor si subscopurilor.

    OBS.1: Datorita semnificatiei procedurale a limbajului Prolog, trebuie urmarit cu

    atentie modul de definire a unui predicat, atat din punctul de vedere al ordinii clauzelor,

    cat si din punctul de vedere al ordinii scopurilor in corpul regulilor.

    OBS. 2: Ceea ce este neobisnuit in raport cu alte limbaje de programare este

    faptul ca semnificatia declarativa a programului este corecta, indiferent de ordonarea

    clauzelor, in timp ce programul este procedural incorect, avand comportari diferite in

    functie de aceasta ordonare.

    Satisfacerea clauzelor in Prolog (Backtracking)

    Presupunem ca programul nu contine reguli, ci numai fapte Presupunem ca avem un program ce contine si reguli

  • 8/14/2019 Folii Prolog

    11/29

    Folii PrologPrelegerea 3 Pastram Emil4

    1. Programul nu contine reguli, ci numai fapte:Daca scopul are forma p1, p2, , pn, se incearca satisfacerea lui de la stanga la

    dreapta. Atunci cand acesta nu contine variabile, daca baza de fapte satisface intreg

    scopul, Prolog raspunde cu YES, altfel cu NO. Daca scopul contine variabile, atunci

    obiectivul este acela de a gasi toate legaturile posibile pentru variabile, care sa satisfaca

    scopul (deci de a da toate solutiile). Mai precis, se parcurge baza de fapte si se satisface o

    data p1. Se trece apoi la satisfacerea lui p2. Daca p2 este satisfacut, atunci se trece la p3.

    Daca p2 nu se satisface, atunci se dezleaga variabilele lui p 1 si se inspecteaza baza de

    fapte pentru a gasi alte valori care legate de variabilele lui p1 sa resatisfaca p1, apoi se

    reincearca satisfacerea lui p2 cu noile legaturi. Blocarea acestui proces de Backtracking se

    poate face cu predicatul ! (cut), asezat intre doua clauze consecutive pi si pi+1 alescopului. In acest caz, nu se incearca resatisfacerea lui p i.

    Daca programul contine si reguli:

    Satisfacerea scopului se realizeaza in urmatorii pasi:

    a) Presupunem: clauzele p1,, pi au fost satisfacute.b) In vederea satisfacerii lui pi+1 se inspecteaza mai intai baza de fapte. Daca p i+1

    se satisface cu o fapta, se trece la pi+2. Daca nu exista elemente in baza de fapte

    care sa satisfaca pe pi+1, se inspecteaza baza de reguli si se identifica prima

    dintre regulile neluate in consideratie pana in prezent, al carei cap se poate

    unifica cupi+1 : se intra in corpul regulii identificate, considerand clauzele care

    il compun drept componente ale scopului. Daca una din clauzele corpului nu

    poate fi satisfacuta, se identifica o alta regula al carei cap sa se unifice cu p i+1.

    In cazul in care nu exista o asemenea regula, se incearca resatisfacerea

    clauzelor pi, pi-1,

    Unificare: Satisfacerea unui scop de tipul X = Y se face prin incercarea de a unifica X

    cu Y. Din aceasta cauza, dandu-se un scop de tipul X = Y, regulile de decizie care indica

    daca scopul se indeplineste sau nu sunt:

  • 8/14/2019 Folii Prolog

    12/29

    Folii PrologPrelegerea 3 Pastram Emil5

    1. Daca X este variabila neinstantiata, iar Y este instantiata la orice obiect Prolog,atunci scopul reuseste. Ca efect lateral, X se va instantia la aceeasi valoare cu cea

    a lui Y.

    2. Daca atat X cat si Y sunt variabile neinstantiate, scopul X = Y reuseste, variabilaX este legata la Y si reciproc, i.e.: ori de cate ori una dintre cele doua variabile se

    instantiaza la o anumita valoare, cealalta variabila se va instantia la aceeasi

    valoare.

    3. Atomii si numerele sunt intotdeauna egali cu ei insisi.4. Doua structuri (a se vedea sintaxa limbajului) sunt egale daca au acelasi functor,

    acelasi numar de componente si fiecare componenta dintr-o structura este egala

    cu componenta corespunzatoare din cealalta structura.

    Sintaxa limbajului Prolog

    Constantele definesc: Obiecte particulare Relatii particulare

    Constantele sunt de urmatoarele tipuri:

    atomiconstante simbolice (desemneaza predicate Prolog sau argumenteale predicatelor)

    numereAtomii pot fi construiti in 3 moduri; ei pot constitui:

    1) siruri de litere, cifre si caracterul underscore, _, siruri care incep cu o literamica;

    2) siruri de caractere speciale;3) siruri de caractere incluse intre paranteze simple (ex.: South_America).

    Numerele: majoritatea implementarilor admit o gama de valori cuprinse intre

    16383 si +16383, dar gama poate fi si mai larga.

  • 8/14/2019 Folii Prolog

    13/29

    Folii PrologPrelegerea 3 Pastram Emil6

    Variabilele: au denumiri care incep cu litere mari; numele de variabila poate incepe si

    cu simbolul _, ceea ce indica o variabila anonima;

    utilizarea unei variabile anonime semnifica faptul ca nu intereseazavaloarea la care se va instantia acea variabila;

    scopul lexical al unui nume de variabila il constituie o unica clauza. (Daca,spre exemplu, numele X15 intervine in doua clauze diferite, atunci el

    semnifica doua variabile diferite. Fiecare ocurenta a lui X15 in interiorul

    aceleiasi clauze semnifica insa o aceeasi variabila).

    Structurile sunt obiecte ce desemneaza o colectie de obiecte corelate logic, careformeaza componentele structurii.

    Ex: poseda(mihai, carte(prolog, clocksin, 1981))

    Sunt folosite la reprezentarea structurilor de date (liste, arbori) O structura se defineste prin specificarea:

    numelui structurii (functorul structurii); elementelorsau componentelorstructurii.

    Desi alcatuite din mai multe componente, sunt tratate de program ca obiecteunice. Pentru combinarea componentelor intr-un unic obiect, este folosit un

    functor. Acesta va fi radacina arborelui intr-o reprezentare arborescenta.

  • 8/14/2019 Folii Prolog

    14/29

    Folii PrologPrelegerea 4 Pastram Emil1

    Operatori Operatori aritmetici:

    - sunt o rescriere infixata a unor structuri si de aceea valoareaexpresiei definite cu ei nu este calculata;

    - evaluarea expresiei se face la cerere in cazul in care se folosesteoperatorul predefinit infixat is, ca in exemplul: X is 1+2 (in acest

    caz se instantiaza variabila X la valoarea 3).

    Operatori relationali:- sunt predicate predefinite infixate;- cel mai important este operatorul de egalitate, care functioneaza ca

    si cand ar fi definit prin urmatorul fapt: X = X (VEZI satisfacerea

    unui scop de tipul X = Y, prin incercarea de a unifica X cu Y).

    Un exemplu:

    ?- X = 1+2. ?- X is 1+2.

    Prolog raspunde Prolog raspunde

    X = 1+2 X = 3

    deoarece, in primul caz, expresia 1+2 denota o structura (termen) Prolog, unde + este

    functorul, iar 1 si 2 sunt argumentele sale. Nimic din acest scop nu declanseaza adunarea,

    care este declansata de operatorul is.

    Operatori relationalicontinuare:

    - Operatorul de inegalitate =\= se defineste ca un predicat opus celui de egalitate;scopul X=\=Y reuseste daca scopul X=Y nu este satisfacut si esueaza daca X=Y

    reuseste (semnificatie: valorile lui X si Y nu sunt egale).

    - Predicatul == testeaza echivalenta a doua variabile; X==Y reuseste ori de cateori X=Y reuseste, dar reciproca este falsa. Este vorba de egalitatea literala a doi

    termeni.

  • 8/14/2019 Folii Prolog

    15/29

    Folii PrologPrelegerea 4 Pastram Emil2

    - X==Y este adevarat daca termenii X si Y sunt identici, adica au exact aceeasistructura si toate componentele corespunzatoare coincid. In particular, numele de

    variabile trebuie sa fie aceleasi.

    - Relatia complementara (de non-identitate) este \==Un exemplu:

    ?- f(a, X) == f(a, Y).

    no

    - Operatorul =:= face numai evaluare aritmetica si nici o instantiere; semnificatialui X =:= Y este: valorile expresiilor aritmetice X si Y sunt egale.

    Diferenta dintre operatorii = si =:=

    ?- 1+2 =:= 2+1.

    yes

    ?- 1+2 = 2+1.

    no

    - Inegalitatea a doua expresii aritmetice se stabileste cu operatorul =\= (vezi foliaanterioara).

    Valorile expresiilor aritmetice pot fi comparate prin intermediul operatorilor care

    urmeaza. Acesti operatori forteaza evaluarea argumentelor lor.

    X > Y (X este mai mare ca Y)

    X < Y (X este mai mic ca Y)

    X >= Y (X mai mare sau egal decat Y)

    X

  • 8/14/2019 Folii Prolog

    16/29

    Folii PrologPrelegerea 4 Pastram Emil3

    - Efectuarea operatiilor aritmetice trebuie sa fie ceruta in mod explicit de catreprocedura incorporata is.

    - Exista proceduri incorporate asociate operatorilor predefiniti +, -, *, /, div si mod.- In momentul in care se efectueaza evaluarea, toate argumentele trebuie sa fie deja

    instantiate la anumite numere.

    - Valorile expresiilor aritmetice pot fi comparate prin intermediul unor operatoricum ar fi

  • 8/14/2019 Folii Prolog

    17/29

    Folii PrologPrelegerea 4 Pastram Emil4

    - Exemplu: In loc de a utiliza structuraare (coco, pene)

    se poate defini un nou operator are

    :- op (600, xfx, are).

    caz in care este legala expresia

    coco are pene

    - Operatorii sunt atomi, iar precedenta lor trebuie sa fie o valoare intreaga intr-unanumit interval si corelata cu precedenta operatorilor predefiniti in limbaj.

    - Tipul operatorilor fixeaza caracterul infixat, prefixat sau postfixat al operatoruluisi precedenta operanzilor sai. Tipul operatorului se defineste utilizand una din

    urmatoarele forme standard:

    (1) operatori infixati: xfx xfy yfx(2) operatori prefixati: fx fy(3) operatori postfixati: xf yf

    undefreprezinta operatorul, iarx siy operanzii sai.

    - Utilizarea simboluluix sau a simboluluiy depinde de precedenta operandului fatade operator. Precedenta operanzilor se defineste astfel:

    un argument intre paranteze sau un argument nestructurat are precedenta0;

    un argument de tip structura are precedenta egala cu cea a functoruluioperator.

    - Semnificatiile luix siy in stabilirea tipului operatorului sunt urmatoarele: x reprezinta un argument (operand) cu precedenta strict mai mica decat

    cea a functorului (operatorului)f:

    precedenta (x) < precedenta (f)

    y reprezinta un argument (operand) cu precedenta mai mica sau egala cucea a functorului (operatorului)f:

    precedenta (y)

  • 8/14/2019 Folii Prolog

    18/29

    Folii PrologPrelegerea 4 Pastram Emil5

    - Numele operatorului poate fi orice atom Prolog care nu este deja definit in Prolog.Se poate folosi si o lista de atomi, daca se definesc mai multi operatori cu aceeasi

    precedenta si acelasi tip.

    Exemplu

    :- op (100, xfx, [este, are]).

    :- op (100, xf, zboara).

    coco are pene.

    coco zboara.

    coco este papagal.

    bozo este pinguin.

    ?- Cine are pene.

    Cine = coco

    ?- Cine zboara.

    Cine = coco

    ?- Cine este Ce.

    Cine = coco, Ce = papagal;

    Cine = bozo, Ce = pinguin;

    no

    In conditiile in care se adauga la baza de cunostinte anterioara si definitia

    operatorilor daca, atunci si si

    :- op (870, fx, daca).

    :- op (880, xfx, atunci).

    :- op (880, xfy, si).

    urmatoarea structura este valida in Prolog:

    daca Animalul are pene

    si Animalul zboara

    atunci Animalul este pasare.

  • 8/14/2019 Folii Prolog

    19/29

    Folii PrologPrelegerea 4 Pastram Emil6

    Controlul procesului de Backtracking:cut sifail

    - Predicatul cut, notat cu atomul special ! este un predicat standard, fara argumente,care se indeplineste (este adevarat) intotdeauna si nu poate fi resatisfacut.

    -

    Comportarea predicatului cuteste urmatoarea:

    (C1) H :- D1, D2, , Dm, ! , Dm+1, , Dn.

    (C2) H :- A1, , Ap.

    (C3) H.

    Daca D1, D2, , Dm sunt satisfacute, ele nu mai pot fi resatisfacute datorita luicut(se inhiba backtracking-ul).

    Daca D1, D2, , Dm sunt satisfacute, C2 si C3 nu vor mai fi utilizate pentruresatisfacerea lui H. Resatisfacerea lui H se poate face numai prin resatisfacerea

    unuia din scopurile Dm+1, , Dn, daca acestea au mai multe solutii.

    Observatie: Exista doua contexte diferite in care se poate utiliza predicatul cut, si

    anume: intr-un context predicatul cut se introduce numai pentru cresterea eficientei

    programului, caz in care el se numeste cut verde; in celalalt context utilizarea lui cut

    modifica semnificatia procedurala a programului, caz in care el se numeste cut rosu. (La

    cut-ul verde semnificatia procedurala a programului este aceeasi, adica nu conteaza

    ordinea in care se scriu clauzele. La un cutrosu efectul programului este total diferit daca

    se schimba ordinea clauzelor).

    Cut rosu

    Introducerea unui cutrosu modifica corespondenta dintre semnificatia declarativa

    si semnificatia procedurala a programelor Prolog. El permite exprimarea in Prolog a unor

    structuri de control de tipul

    Daca conditie atunci actiune1

    altfel actiune2

    astfel:

  • 8/14/2019 Folii Prolog

    20/29

    Folii PrologPrelegerea 4 Pastram Emil7

    daca_atunci_altfel (Cond, Act1, Act2) :- Cond, !, Act1.

    daca_atunci_altfel (Cond, Act1, Act2) :- Act2.

    Obs.: Utilizarea predicatului cut in definirea predicatului asociat structurii de

    control daca_atunci_altfel introduce un cut rosu deoarece efectul programului este total

    diferit daca se schimba ordinea clauzelor.

    Exemplu

    Definirea predicatului de aflare a minimului dintre doua numere, in doua variante:

    min1(X, Y, X) :- X=Y.

    min2(X, Y, X) :- X=

  • 8/14/2019 Folii Prolog

    21/29

    Folii PrologPrelegerea 5 Pastram Emil1

    Predicatul fail

    Prolog permite exprimarea directa a esecului unui scop cu ajutorul predicatuluifailun predicat:

    standard, fara argumente, care esueaza intotdeauna.

    Dupafail nu se mai poate satisface nici un scop. Introducerea unui predicat fail intr-o conjunctie de scopuri, de obicei la sfarsit

    (caci dupa fail nu se mai poate satisface nici un scop), determina intrarea in

    procesul de backtracking.

    Dacafail se intalneste dupa predicatul cut, nu se mai face backtracking.Exemplul 1 (folosirea predicatuluifail pentru a determina esecul):

    Enuntul Un individ este rau daca nu este bun se poate exprima astfel:

    rau (X) :- bun (X),!,fail.

    rau (X).

    Exemplu de programfolosirea luifail pentru a determina esecul:

    bun (gelu).

    bun (vlad).

    bun (mihai).

    rau (X) :- bun (X),!,fail. (*)

    rau (X). (**)

    Exemplu de executie a programului:

    ?- rau (gelu).

    no

    ?- rau (mihai).

    no

    rau (petru).

    yes

  • 8/14/2019 Folii Prolog

    22/29

    Folii PrologPrelegerea 5 Pastram Emil2

    Comentariu:

    - la prima interogare: din clauza (*) avem rau (gelu) daca bun (gelu), care esteadevarat din primul fapt al bazei de cunostinte; apoi ! este intotdeauna adevarat si

    urmeazafail care genereaza esec; datorita existentei lui cut, clauza (**) nu va mai

    fi utilizata pentru resatisfacerea scopului; deci raspunsul ramane no, ca si in al

    doilea caz;

    - la a treia interogare: pentru clauza (*) ar trebui sa am bun (petru), dar acest faptnu exista in baza de cunostinte; deoarece bun(petru) nu a fost satisfacut, am voie

    sa utilizez clauza (**); clauza (**) furnizeaza rau (petru), deci satisface scopul

    curent; atunci raspunsul este yes.

    Observatie: Atunci cand este folosit pentru a determina esecul, fail este de obicei

    precedat de cut, deoarece procesul de backtracking pe scopurile care il preced este inutil,

    scopul esuand oricum, datorita lui fail.

    Exemplul 2 introducerea predicatului fail pentru a genera procesul de

    backtracking pe scopurile care il preced:

    rosu (mar).

    rosu (cub).

    rosu (soare).

    afisare (X) :- rosu (X), write (X), fail.

    afisare (_). (*)

    Comentariu: Intrucat, pentru fiecare obiect considerat, scopul afisare (X) esueaza

    datorita luifail, se trece la clauza (*), care afiseaza obiectul respectiv, adica raspunde yes.

    Trecerea la clauza (*) este posibila deoarece prima clauza nu contine cut inainte de fail.

    In acest fel, vor fi afisate toate obiectele rosii cunoscute de programul Prolog, datorita

    procesului de backtracking generat de fail; in acest fel se realizeaza, prin fail, o iteratie

    peste faptele rosu ( ). Clauza afisare (_) este adaugata pentru ca raspunsul final la

    satisfacerea scopului sa fie afirmativ. (Aceasta clauza raspundeyes la orice).

  • 8/14/2019 Folii Prolog

    23/29

    Folii PrologPrelegerea 5 Pastram Emil3

    Cum lucreaza programul anterior cu si faracut inaintea lui fail:

    1. Cazul cand NU avem cut inaintea lui fail: programul raspunde YES la orice(datorita clauzei a doua); afiseaza (datorita lui write (X)) numai obiectele rosii

    cunoscute de program (pentru aceste obiecte se scrie denumirea lor si apoi yes).

    2. Cazul cand inaintea luifail exista cut: Pentru un obiect rosu cunoscutde program este scris numele obiectului si se

    raspunde NO (pentru ca, datorita lui cut, nu se mai ajunge la clauza a doua).

    Pentru un obiect necunoscut de program nu se mai afiseaza nimic si seraspunde YES. (Aceasta deoarece, nefiind satisfacute clauzele dinaintea lui

    cut, se ajunge la clauza a doua, care genereaza raspunsul YES).

    Observatie: Combinatia !,fail poate fi utilizata cu rol de negatie.

    Exemplu:Mihai iubeste toate sporturile cu exceptia boxului.

    Pseudocod:

    daca X este sport si X este box

    atunci Mihai iubeste X este fals

    altfel daca X este sport

    atunci Mihai iubeste X este adevarat

    PROLOG

    Varianta 1(cut rosu):

    iubeste (mihai, X) :- sport (X), box (X), !, fail.

    iubeste (mihai, X) :- sport (X).

    Comentariu: Predicatul cututilizat aici este un cut rosu.

    Comentariu: Predicatul cut utilizat aici este un cut rosu. Combinatia !,fail este

    utilizata cu rol de negatie (pentru ca fail raspunde no, iar cut ma impiedica sa folosesc

    clauza urmatoare). Se mai spune ca limbajul Prolog modeleaza negatia ca esec al

    satisfacerii unui scop (negatia ca insucces), aceasta fiind, de fapt, o particularizare a

  • 8/14/2019 Folii Prolog

    24/29

    Folii PrologPrelegerea 5 Pastram Emil4

    ipotezei lumii inchise. Combinatia !,fail este echivalenta cu un predicat standard existent

    in Prolog, si anume predicatul not.

    Predicatul notadmite ca argument un predicat Prolog si reuseste daca predicatulargument esueaza.

    In Sicstus Prolog sintaxa pentru predicatul noteste\+Varianta 2 (cu predicatul not):

    iubeste (mihai, X) :- sport (X), not (box(X)).

    iubeste (mihai, X) :- sport (X).

    Varianta 1program:

    box(box).

    sport(tenis).

    sport(polo).

    sport(innot).

    sport(box).

    iubeste(mihai,X):-sport(X),box(X),!,fail.

    iubeste(mihai,X):-sport(X).

    Exemple de interogari:

    ?- sport(X).

    X=tenis ?;

    X=polo ?;

    X=innot ?;

    X=box ?;

    no

    ?-sport(tenis).

    yes

  • 8/14/2019 Folii Prolog

    25/29

    Folii PrologPrelegerea 5 Pastram Emil5

    ?- iubeste(mihai,tenis).

    yes

    ?- iubeste(mihai,box).

    no

    Varianta 2program:

    box(box).

    sport(tenis).

    sport(polo).

    sport(innot).

    sport(box).

    iubeste(mihai,X) :- sport(X),\+(box(X)).

    iubeste(mihai,X) :- sport(X).

    Exemple de interogari:

    - La primele trei interogari

    ?- sport(X).

    ?- sport(tenis).

    ?-iubeste(mihai,tenis).

    rezultatul este identic cu cel de la programul anterior.

    - La ultima interogare rezultatul difera:

    ?- iubeste(mihai,box).

    yes

    Aici raspunsul este YES deoarece, dupa ce esueaza prima clauza, se trece la

    urmatoarea, care este satisfacuta. (Intrucat nu exista predicatul cut, se poate trece la

    clauza urmatoare).

  • 8/14/2019 Folii Prolog

    26/29

    Folii PrologPrelegerea 5 Pastram Emil6

    Observatie: Chiar daca prima clauza este satisfacuta, se trece oricum la clauza

    urmatoare (a doua) pentru ca este posibil ca ea sa furnizeze o noua solutie.

    Predicatulcall

    - call este un alt predicat standard. El admite ca argument un predicat Prolog si areca efect incercarea de satisfacere a predicatului argument.

    - call reuseste daca predicatul argument reuseste si esueaza in caz contrar.- Utilizand acest predicat, se poate explicita efectul general al predicatului standard

    notastfel:

    not(P) :- call(P),!,fail.

    not(P).

    Observatie: Atat predicatul not, cat si predicatul call sunt predicate de ordinul II

    in Prolog, deoarece admit ca argumente alte predicate.

    Alte predicate incorporate

    Predicatul =..

    - Se scrie ca un operator infixat.- Scopul

    Term =.. L

    este satisfacut daca L este o lista ce contine principalul functor al lui Term, urmat de

    argumentele sale.

    Exemplu:

    ?- f(a,b) =.. L.

    L = [f,a,b]

    ?- T =.. [dreptunghi, 3, 5].

    T = dreptunghi(3,5)

    ?- Z =.. [p,X,f(X,Y)].

    Z = p(X,f(X,Y))

    Observatie: Acest predicat descompune un termen in componentele sale adica

    functorul sau si argumentele acestuia.

  • 8/14/2019 Folii Prolog

    27/29

    Folii PrologPrelegerea 5 Pastram Emil7

    Predicatulbagof

    Scopul

    bagof(X,P,L)

    va produce lista L a tuturor obiectelor X astfel incat sa fie satisfacut un scop P.

    Observatie: Aceasta are sens numai daca X si P au unele variabile comune.

    Exemplu: Presupunem ca programul contine urmatoarele fapte

    varsta (petru,7).

    varsta(ana,5).

    varsta(patricia,8).

    varsta(tom,5).

    Atunci putem obtine lista tuturor copiilor care au 5 ani prin urmatoarea interogare:

    ?-bagof(Copil,varsta(Copil,5),Lista).

    Lista = [ana, tom]

    Predicatulfindall

    findall(X,P,L)

    produce, de asemenea, o lista de obiecte care satisfac P. Diferenta fata de bagof este

    aceea ca sunt colectate toate obiectele X, indiferent de solutii posibil diferite pentru

    variabile din P care nu sunt partajate cu X.

    Daca nu exista nici un obiect X care sa satisfaca P, atunci findall va avea succes

    cu L = [ ].

    Predicate standard de intrare / iesire (intotdeauna adevarate)

    Predicatul write- are forma write(E1, E2, , Ek)

    unde E1, E2, , Ek sunt variabile sau obiecte elementare. Orice variabila trebuie sa fie

    legata in momentul scrierii!

    - nl face trecerea pe linia urmatoare

  • 8/14/2019 Folii Prolog

    28/29

    Folii PrologPrelegerea 5 Pastram Emil8

    Predicatul readln- Permite citirea unui string sau simbol. Valoarea obtinuta in urma citirii este legata

    la X din

    readln(X)LISTE

    O lista este de forma [Cap|Coada].

    Operatii cu liste:

    1. Apartenenta la o lista- se foloseste predicatul membru(X,L), unde X este un obiect si L este o lista. X este

    membru al lui L daca(1) X este capul lui L

    sau

    (2) X este membru al cozii lui LADICA

    membru(X, [X|Coada]).

    membru(X, [Cap|Coada]):-membru(X, Coada).

    2. Concatenarea- se foloseste relatia conc(L1, L2, L3)- definitia predicatului conc este:conc([ ], L, L).

    conc([X|L1], L2, [X|L3]) :- conc(L1, L2, L3).

    3. Adaugarea unui element- elementul adaugat devine noul cap:add(X, L, [X|L]).

    4. Stergerea unui element- se foloseste relatia del(X, L, L1)- definitia predicatului del este:

  • 8/14/2019 Folii Prolog

    29/29

    Folii PrologPrelegerea 5 Pastram Emil9

    del(X, [X|Coada], Coada).

    del(X, [Y|Coada], [Y|Coada1]) :- del(X,Coada, Coada1).

    Observatie: Inserarea unui element intr-o lista poate fi definita folosind relatia del,

    astfel:

    insert(X, Lista, ListaMaiMare):-

    del (X, ListaMaiMare, Lista).

    Subliste

    relatia sublista([c,d,e], [a,b,c,d,e,f]) este adevarata, dar sublista([c,e], [a,b,c,d,e,f]) nu este

    adevarata.

    Definitie:

    S este o sublista a lui L daca

    (1) L poate fi descompusa in doua liste, L1 si L2si

    (2) L2 poate fi descompusa in doua liste, S si o alta lista L3adica

    sublista(S,L) :- conc(L1,L2,L), conc(S,L3,L2).


Recommended