This shows you the differences between two versions of the page.
pp:23:laboratoare:prolog:legare-executie [2023/05/09 12:09] bot.pp created |
pp:23:laboratoare:prolog:legare-executie [2023/05/17 08:42] (current) alexandru.bala [Puterea generativă a limbajului] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Prolog: Legare și execuție ====== | ====== Prolog: Legare și execuție ====== | ||
- | * Data publicării: TODO | + | * Data publicării: 09.05.2023 |
- | * Data ultimei modificări: 05.05.2023 | + | * Data ultimei modificări: 09.05.2023 |
===== Obiective ===== | ===== Obiective ===== | ||
- | Scopul acestui laborator este introducerea și //înțelegerea// unor noțiuni mai avansate de Prolog: | + | Scopul acestui laborator este introducerea și înțelegerea unor noțiuni mai avansate de Prolog: |
* procesul de backtracking realizat de Prolog | * procesul de backtracking realizat de Prolog | ||
Line 15: | Line 15: | ||
===== Recapitulare ===== | ===== Recapitulare ===== | ||
- | Laboratorul trecut a introdus două elemete ale limbajului importante: | + | Laboratorul trecut a introdus două elemente ale limbajului importante: |
<HTML><ul></HTML> | <HTML><ul></HTML> | ||
Line 23: | Line 23: | ||
<HTML><li></HTML>operatorul de [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:unify|unificare]], ''%%=%%'' [[https://www.swi-prolog.org/pldoc/doc_for?object=(%3D)/2|doc]]<HTML></li></HTML><HTML></ul></HTML> | <HTML><li></HTML>operatorul de [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:unify|unificare]], ''%%=%%'' [[https://www.swi-prolog.org/pldoc/doc_for?object=(%3D)/2|doc]]<HTML></li></HTML><HTML></ul></HTML> | ||
- | Un exemplu foarte simplu de legare unei variabile este prima interograre de mai jos, unde ''%%X%%'' s-a legat la atomul (constanta) ''%%socrate%%'' pentru a satisface scopul ''%%om(X)%%'' și apoi este printat atomul. | + | Un exemplu foarte simplu de legare unei variabile este prima interogare de mai jos, unde ''%%X%%'' s-a legat la atomul (constanta) ''%%socrate%%'' pentru a satisface scopul ''%%om(X)%%'' și apoi este printat atomul. |
<code> | <code> | ||
Line 56: | Line 56: | ||
Ceea ce merită clarificat este că legarea unei variabile la o valoare este un pas necesar în procesul de unificare. | Ceea ce merită clarificat este că legarea unei variabile la o valoare este un pas necesar în procesul de unificare. | ||
- | Am spus mai devereme că nicio regulă a predicatului ''%%caesar%%'' nu unifică cu ''%%caesar(socrate)%%''. Sau ''%%om(X)%%'' unifică cu ''%%om(socrate)%%'' leagându-l pe ''%%X%%'' la ''%%socrate%%''. | + | Am spus mai devreme că nicio regulă a predicatului ''%%caesar%%'' nu unifică cu ''%%caesar(socrate)%%''. Sau ''%%om(X)%%'' unifică cu ''%%om(socrate)%%'' legându-l pe ''%%X%%'' la ''%%socrate%%''. |
Totuși de ce legarea este importantă în înțelgerea unificării? În exemplul de mai jos cele două expresii diferă, deci nu ar trebui să unifice. | Totuși de ce legarea este importantă în înțelgerea unificării? În exemplul de mai jos cele două expresii diferă, deci nu ar trebui să unifice. | ||
Line 99: | Line 99: | ||
</code> | </code> | ||
- | În exemplul anterior am văzut că variabile denumite la fel (având același indentificator), ''%%A%%'' se pot lega în aceeași interogare la diferite valori, ''%%1%%'' și ''%%2%%''. Deși cel mai bine este să consultați standardul limbajului, de obicei întinderea domeniului de vizibilitate a unei variabile este o singură caluză sau o interogare. | + | În exemplul anterior am văzut că variabile denumite la fel (având același identificator), ''%%A%%'' se pot lega în aceeași interogare la diferite valori, ''%%1%%'' și ''%%2%%''. Deși cel mai bine este să consultați standardul limbajului, de obicei întinderea domeniului de vizibilitate a unei variabile este o singură clauză sau o interogare. |
==== Negația ca eșec (\+) ==== | ==== Negația ca eșec (\+) ==== | ||
Line 125: | Line 125: | ||
?- p1(X). | ?- p1(X). | ||
X = andrei ; | X = andrei ; | ||
- | false. % se incearcă și găsirea următorului student care satisface cea de-a doua | + | false. % se încearcă și găsirea următorului student care satisface cea de-a doua |
% premisă, însă nu se poate | % premisă, însă nu se poate | ||
Line 212: | Line 212: | ||
</code> | </code> | ||
- | Inițial, se va încerca unificarea scopul ''%%membru(N, [1, 2, 3])%%'' cu faptul ''%%membru(Elem, [Elem | _]).%%''. Deci ar trebui să unificăm ''%%Elem = N%%'' și ''%%Elem = 1%%'', ceea ce poate prin legarea ''%%N = 1%%''. | + | Inițial, se va încerca unificarea scopului ''%%membru(N, [1, 2, 3])%%'' cu faptul ''%%membru(Elem, [Elem | _]).%%''. Deci ar trebui să unificăm ''%%Elem = N%%'' și ''%%Elem = 1%%'', ceea ce poate prin legarea ''%%N = 1%%''. |
- | Când alegem să ni se mai //genereze// un răspuns, tastând ''%%;%%'', se va încerca unificarea cu antetul de regulă ''%%membru(Elem, [_ | Rest])%%'', în care ''%%Elem = N%%'', iar ''%%Rest = [2, 3]%%''. Acestă încercare implică satisfacerea unui nou scop, ''%%membru(N, [2, 3])%%''. Noul scop va unifica, de asemenea, cu primul fapt, ''%%membru(Elem, [Elem | _])%%'', din care va rezulta ''%%N = 2%%''. | + | Când alegem să ni se mai //genereze// un răspuns, tastând ''%%;%%'', se va încerca unificarea cu antetul de regulă ''%%membru(Elem, [_ | Rest])%%'', în care ''%%Elem = N%%'', iar ''%%Rest = [2, 3]%%''. Această încercare implică satisfacerea unui nou scop, ''%%membru(N, [2, 3])%%''. Noul scop va unifica, de asemenea, cu primul fapt, ''%%membru(Elem, [Elem | _])%%'', din care va rezulta ''%%N = 2%%''. |
Asemănător se va găsi și soluția ''%%N = 3%%'', după care nu va mai reuși nicio altă unificare. | Asemănător se va găsi și soluția ''%%N = 3%%'', după care nu va mai reuși nicio altă unificare. | ||
Line 226: | Line 226: | ||
</code> | </code> | ||
- | Ca să generăm o permutare pentru o listă ''%%[Head | Rest]%%'', vom genera mai întâi o permutare pentru lista ''%%Rest%%''. Apoi ne vom folosi de predicatul ''%%remove%%'' pentru a insera pe ''%%Head%%'' pe diferinte poziții în această "subpermutare". | + | Ca să generăm o permutare pentru o listă ''%%[Head | Rest]%%'', vom genera mai întâi o permutare pentru lista ''%%Rest%%''. Apoi ne vom folosi de predicatul ''%%remove%%'' pentru a insera pe ''%%Head%%'' pe diferite poziții în această "subpermutare". |
<code> | <code> | ||
Line 423: | Line 423: | ||
</code> | </code> | ||
- | Considerăm adăugarea primului element **doar** dacă este mai mic decât suma cerută. Apoi am renunțat la posibilitatea folosirii variabilei ''%%Sum%%'' neinstațiate pentru a eficientiza apelurile recursive. | + | Considerăm adăugarea primului element **doar** dacă este mai mic decât suma cerută. Apoi am renunțat la posibilitatea folosirii variabilei ''%%Sum%%'' neinstanțiate pentru a eficientiza apelurile recursive. |
===== Aflarea tuturor soluțiilor pentru satisfacerea unui scop ===== | ===== Aflarea tuturor soluțiilor pentru satisfacerea unui scop ===== | ||
Line 464: | Line 464: | ||
===== Resurse ===== | ===== Resurse ===== | ||
- | * [[https://github.com/cs-pub-ro/PP-laboratoare/blob/prolog-legare-exec/prolog/legare-executie/prolog_cheatsheet_2.pdf|Cheatsheet]] | + | * [[https://github.com/cs-pub-ro/PP-laboratoare/raw/master/prolog/legare-executie/prolog_cheatsheet-2.pdf|Cheatsheet]] |
- | * [[https://ocw.cs.pub.ro/courses/_media/pp/22/laboratoare/prolog/legare-executie-schelet.zip|Schelet]] | + | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/legare-executie-schelet.zip|Schelet]] |
- | * [[https://ocw.cs.pub.ro/courses/_media/pp/22/laboratoare/prolog/legare-executie-solutii.zip|Soluții]] | + | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/legare-executie-solutii.zip|Soluții]] |