Differences

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

Link to this comparison view

pp:23:laboratoare:prolog:intro [2023/05/02 14:12]
bot.pp
pp:23:laboratoare:prolog:intro [2023/05/10 07:30] (current)
alexandru.bala [Tipuri de date]
Line 53: Line 53:
 ===== Sintaxă și semantică ===== ===== Sintaxă și semantică =====
  
-Programele scrise în Prolog descriu relații ​exprimitate ​prin clauze. Există două tipuri de clauze:+Programele scrise în Prolog descriu relații ​exprimate ​prin clauze. Există două tipuri de clauze:
  
   * axiome sau fapte (en. //facts//)   * axiome sau fapte (en. //facts//)
Line 93: Line 93:
 ==== Termeni ==== ==== Termeni ====
  
-În Prolog orice valoare se numește [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​term|termen]]. Tipuri simpli de termeni: ​constante, sau mai bine zis //atomi// simbolici, întregi, numere în virgulă mobilă sau termeni compuși.+În Prolog orice valoare se numește [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​term|termen]]. Tipuri simpli de termeni:
  
-Cuvântul [[https://www.swi-prolog.org/pldoc/man?​section=glossary#​gloss:​structure|structură]] este un sinonim pentru termenul [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​compound|compus]].+  * Constante textuale, sau mai bine zis //atomi//<​code>​ 
 +nume, ion, popescu
  
-<​code>​+</​code>​ 
 +  * Numere întregi/​numere în virgulă mobilă 
 +  * Variabile (vom detalia mai departe)<​code>​ 
 +?- om(X). 
 +X = socrate. 
 + 
 +</​code>​ 
 +  * Termeni [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​compound|compuși]].<​code>​
 % exemplu structură % exemplu structură
 client(nume(ion,​ popescu), carte(aventuri,​ 2002)). client(nume(ion,​ popescu), carte(aventuri,​ 2002)).
  
 </​code>​ </​code>​
-Puteți considera momentan că sintactic singura diferență este că predicatele nu sunt transmise ca argumente, aceasta fiind o [[https://​stackoverflow.com/​questions/​28972038/​prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference|discuție]] mai subtilă ce ține de reprezentarea internă a implementării. 
  
-Consultați ​**[[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary|glosarul]]** pentru orice detalii suplimentare.+Cuvântul [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​structure|structură]] este un sinonim pentru termenul compus. 
 + 
 +Puteți considera momentan că singura diferență,​ sintactică,​ este că predicatele nu sunt transmise ca argumente, aceasta fiind o [[https://​stackoverflow.com/​questions/​28972038/​prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference|discuție]] mai subtilă ce ține de reprezentarea internă a implementării. 
 + 
 +Consultați [[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary|**glosarul**]] pentru orice detalii suplimentare.
  
 ==== Scopuri și variabile ==== ==== Scopuri și variabile ====
Line 110: Line 121:
 Când rulăm interogări despre termeni și relațiile dintre ei spunem informal că demonstrăm sau obținem informații pornind de la "baza noastră de date" (de la axiome, de la fapte). Când rulăm interogări despre termeni și relațiile dintre ei spunem informal că demonstrăm sau obținem informații pornind de la "baza noastră de date" (de la axiome, de la fapte).
  
-Calcul se face prin încercarea de a satisface[^1] //scopuri// (en. //goals//).+Calcul se face prin încercarea de a satisface [^1] //scopuri// (en. //goals//).
  
 **OBSERVAȚIE**:​ Când am interogat dacă Socrate este muritor, procesul de execuție a returnat ''​%%false%%''​ deoarece **nu** se putea satisface acest scop. Nu înseamnă că el este nemuritor. Aceasta este //ipoteza lumii închise// -- orice nu poate fi demonstrat ca adevărat va fi considerat fals. **OBSERVAȚIE**:​ Când am interogat dacă Socrate este muritor, procesul de execuție a returnat ''​%%false%%''​ deoarece **nu** se putea satisface acest scop. Nu înseamnă că el este nemuritor. Aceasta este //ipoteza lumii închise// -- orice nu poate fi demonstrat ca adevărat va fi considerat fals.
Line 128: Line 139:
 Observați că în a doua interogare am făcut primul nostru calcul util, folosind o variabilă, ''​%%X%%''​. Argumentul nu mai este o valoare particulară,​ ci sistemul de execuție încearcă **legarea** ei la diferite constante sau atomi. Prin convenție numele variabilelor (''​%%X%%''​) începe cu literă mare iar numele atomilor (''​%%leulDinNemeea%%'',​ ''​%%rhesus%%''​) începe cu literă mică. Observați că în a doua interogare am făcut primul nostru calcul util, folosind o variabilă, ''​%%X%%''​. Argumentul nu mai este o valoare particulară,​ ci sistemul de execuție încearcă **legarea** ei la diferite constante sau atomi. Prin convenție numele variabilelor (''​%%X%%''​) începe cu literă mare iar numele atomilor (''​%%leulDinNemeea%%'',​ ''​%%rhesus%%''​) începe cu literă mică.
  
-Așa cum v-ați obișnuit de la Haskell, și Prolog permite folosirea de variablie ​[[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​anonymous|anonime]],​ ''​%%_%%''​. Multiple folosiri ale lui ''​%%_%%''​ nu se leagă la același termen.+Așa cum v-ați obișnuit de la Haskell, și Prolog permite folosirea de variabile ​[[https://​www.swi-prolog.org/​pldoc/​man?​section=glossary#​gloss:​anonymous|anonime]],​ ''​%%_%%''​. Multiple folosiri ale lui ''​%%_%%''​ nu se leagă la același termen.
  
 <​code>​ <​code>​
Line 134: Line 145:
 X = rhesus, X = rhesus,
 Y = tracia. Y = tracia.
 +
 +?- muritor(X), rege(X, _, _).
 +X = rhesus.
  
 </​code>​ </​code>​
Line 202: Line 216:
  
 </​code>​ </​code>​
-Deci mai întâi încearcă demonstrarea primei reguli pentru predicatul ''​%%muritor%%''​ și eșuează. Prima premisă din a doua regulă este adevărată (''​%%viu(X)%%''​). Observăm că **eșecul demonstrației** scopului ''​%%zeu(hercule)%%''​ determină adevărată a doua premisă (''​%%\+ zeu(X)%%''​). Cele două premise fiind puse în conjuncție,​ considerăm că Hercule este muritor.+Observăm că mai întâi încearcă demonstrarea primei reguli pentru predicatul ''​%%muritor%%''​ și eșuează. Prima premisă din a doua regulă este adevărată (''​%%viu(X)%%''​). Observăm că **eșecul demonstrației** scopului ''​%%zeu(hercule)%%''​ determină adevărată a doua premisă (''​%%\+ zeu(X)%%''​). Cele două premise fiind puse în conjuncție,​ considerăm că Hercule este muritor.
  
 === Negația ca eșec în demonstrație === === Negația ca eșec în demonstrație ===
Line 248: Line 262:
 // verificarea celei de-a doua condiții se efectuază doar dacă se trece de prima // verificarea celei de-a doua condiții se efectuază doar dacă se trece de prima
 if (ptr != NULL && ptr->​field != ILLEGAL_VALUE) { if (ptr != NULL && ptr->​field != ILLEGAL_VALUE) {
-  // do something ​usefull+  // do something ​useful
 } }
  
Line 384: Line 398:
  
 </​code>​ </​code>​
-==== Tiprui ​de date ====+==== Tipuri ​de date ====
  
 Am discutat până acum de: Am discutat până acum de:
Line 404: Line 418:
 === Șiruri === === Șiruri ===
  
-O secvență de caractere înscrisă între ''​%%"​%%''​.+O secvență de caractere ​(un [[https://​www.swi-prolog.org/​pldoc/​man?​section=string|string]]) va fi înscrisă între ​ghilimele (''​%%"​%%''​).
  
 <​code>​ <​code>​
-?- X= "​abc",​ string(X), writeln(X).+?- X = "​abc",​ string(X), writeln(X).
 abc abc
 X = "​abc"​. X = "​abc"​.
Line 426: Line 440:
 <​HTML><​li></​HTML>''​%%Arg2%%''​ va fi neinstanțiat atunci când se va încerca satisfacerea predicatului. <​HTML><​li></​HTML>''​%%Arg2%%''​ va fi neinstanțiat atunci când se va încerca satisfacerea predicatului.
 <​HTML><​ul></​HTML>​ <​HTML><​ul></​HTML>​
-<​HTML><​li></​HTML>​Dacă predicatul este satisfăcut,​ ''​%%Arg2%%''​ va fa fi instanțiat la finalul evaluării.<​HTML></​li></​HTML>​+<​HTML><​li></​HTML>​Dacă predicatul este satisfăcut,​ ''​%%Arg2%%''​ va fi instanțiat la finalul evaluării.<​HTML></​li></​HTML>​
 <​HTML><​li></​HTML>​Dacă ''​%%Arg2%%''​ este deja instanțiat la evaluarea predicatului,​ evaluarea poate servi la verificarea corectitudinii argumentului în raport cu semnificația predicatului. <​HTML><​li></​HTML>​Dacă ''​%%Arg2%%''​ este deja instanțiat la evaluarea predicatului,​ evaluarea poate servi la verificarea corectitudinii argumentului în raport cu semnificația predicatului.
 <​HTML><​ul></​HTML>​ <​HTML><​ul></​HTML>​
-<​HTML><​li></​HTML>​Următorul exemplu, din laboratorele ​următore, îl folosește pe ''​%%R%%''​ ca intrare, și pe ''​%%N%%''​ ca o ieșire.<​HTML></​li></​HTML><​HTML></​ul></​HTML>​+<​HTML><​li></​HTML>​Următorul exemplu, din laboratoarele ​următoare, îl folosește pe ''​%%R%%''​ ca intrare, și pe ''​%%N%%''​ ca o ieșire.<​HTML></​li></​HTML><​HTML></​ul></​HTML>​
  
 <​code>​ <​code>​
Line 453: Line 467:
   * [[https://​github.com/​cs-pub-ro/​PP-laboratoare/​raw/​master/​prolog/​intro/​prolog-cheatsheet-1.pdf|Cheatsheet]]   * [[https://​github.com/​cs-pub-ro/​PP-laboratoare/​raw/​master/​prolog/​intro/​prolog-cheatsheet-1.pdf|Cheatsheet]]
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​23/​laboratoare/​prolog/​intro-schelet.zip|Schelet]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​23/​laboratoare/​prolog/​intro-schelet.zip|Schelet]]
-  * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​23/​laboratoare/​prolog/​intro-solutie.zip|Soluții]]+  * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​23/​laboratoare/​prolog/​intro-solutii.zip|Soluții]]
  
 ===== Referințe ===== ===== Referințe =====
pp/23/laboratoare/prolog/intro.1683025944.txt.gz · Last modified: 2023/05/02 14:12 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