Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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]]
  
  
pp/23/laboratoare/prolog/legare-executie.1683623383.txt.gz · Last modified: 2023/05/09 12:09 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0