Differences

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

Link to this comparison view

pp:21:teme:prolog-integrame [2021/05/08 23:02]
andrei.olaru created
pp:21:teme:prolog-integrame [2021/05/23 17:25] (current)
andrei.olaru [Changelog]
Line 1: Line 1:
 ====== Prolog:​Integrame ====== ====== Prolog:​Integrame ======
  
-  * Data publicării:​ 08.04.2021 +  ​* Responsabili:​ Andrei Olaru, Teodora Argintaru, Andrei Popovici 
-  * Data ultimei modificări: ​08.04.2021 ([[#​changelog]]) +  ​* Data publicării:​ 08.05.2021 
-  * Tema (o arhivă .zip cu fișierul integrame.pl) se va încărca pe vmchecker ​(în curând)+  * Data ultimei modificări: ​12.05.2021 ([[#​changelog]]) 
 +  * Tema (o arhivă .zip cu fișierul integrame.pl) se va încărca pe [[https://vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]]
   * [[https://​curs.upb.ro/​mod/​forum/​view.php?​id=292431|Forum tema 3]]   * [[https://​curs.upb.ro/​mod/​forum/​view.php?​id=292431|Forum tema 3]]
- 
-/* 
-[[https://​vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]] 
-*/ 
  
 ===== Organizare ===== ===== Organizare =====
Line 73: Line 70:
  
 Pe lângă definiția celulelor, integrama conține și un vocabular, o listă de cuvinte pe care le putem folosi pentru a completa integrama. Pe lângă definiția celulelor, integrama conține și un vocabular, o listă de cuvinte pe care le putem folosi pentru a completa integrama.
 +
 +În temă, predicatul ''​integrama(0,​ X)''​ va lega variabila ''​X''​ la o structură, descriind integrama de mai sus, de forma:
 +
 +<code Prolog>
 +X = integ(5,​5,​[ ​     <- înălțimea și lățimea integramei, în număr de celule
 +  ((0,​0),​x), ​        <- celulă neagră, la coordonata 0,0
 +  ((0,4),x),
 +  ((1,4),x),
 +  ((2,4),x),
 +  ((3,4),x),
 +  ((4,4),x),
 +  ((0,1),x),
 +  ((1,​1),​[('​Negativ',​j,​0),​('​Afirmativ',​d,​1)]), ​  <- celulă cu două întrebări,​ una în jos și una la dreapta
 +  ((0,​2),​[('​Al doilea număr',​j,​2)]), ​            <- celulă cu o singură întrebare, în jos
 +  ((0,​3),​[('​Primii 3 din artă',​j,​3)]),​
 +  ((1,0),x),
 +  ((2,​0),​[('​Din care plouă',​d,​4)]), ​             <- celulă cu o singură întrebare, la dreapta
 +  ((3,​0),​[('​Când nu îmi amintesc',​d,​5)]),​
 +  ((4,0),x),
 +  ((4,1),x),
 +  ((4,2),x),
 +  ((4,3),x)],
 + ​['​DA','​NU','​NOR','​ART','​UIT','​DOI'​] ​           <- setul de cuvinte disponibile pentru a completa integrama
 +)
 +</​code>​
 +
 +Puteți foarte bine "​citi"​ elementele integramei prin pattern-match,​ inclusiv direct în predicatul ''​integrama'',​ ca ''​integrama(0,​ integ(H, W, Celule, Vocabular))''​.
  
 Ne interesează să rezolvăm integrama orbește, fără să ne uităm la legătura dintre textul întrebării și textul răspunsului. Vom încerca să potrivim cuvinte în integramă, considerând că: Ne interesează să rezolvăm integrama orbește, fără să ne uităm la legătura dintre textul întrebării și textul răspunsului. Vom încerca să potrivim cuvinte în integramă, considerând că:
Line 84: Line 108:
 **Important:​** Citiți comentariile din surse (mai ales din ''​integrame.pl''​). Acestea conțin toate detaliile despre predicatele cerute și despre structurile folosite. **Important:​** Citiți comentariile din surse (mai ales din ''​integrame.pl''​). Acestea conțin toate detaliile despre predicatele cerute și despre structurile folosite.
  
-Lucrați în fișierul ''​integrame.pl''​. Acesta conține documentația tuturor predicatelor cerute.+**Lucrați ​numai în fișierul ''​integrame.pl''​.** Acesta conține documentația tuturor predicatelor cerute.
  
 Fișierul ''​input.pl''​ conține integramele folosite la testare. **Atenție:​** integramele sunt definite aici într-un format oarecum diferit de cel folosit în predicate. Folosiți predicatul ''​integrama/​2''​ pentru a obține integramele. Fișierul ''​input.pl''​ conține integramele folosite la testare. **Atenție:​** integramele sunt definite aici într-un format oarecum diferit de cel folosit în predicate. Folosiți predicatul ''​integrama/​2''​ pentru a obține integramele.
Line 94: Line 118:
 Fișierul ''​solutie.pl''​ conține soluțiile la integramele din ''​input.pl''​. **Nu** folosiți predicatul ''​solutie''​ în rezolvare. Fișierul ''​solutie.pl''​ conține soluțiile la integramele din ''​input.pl''​. **Nu** folosiți predicatul ''​solutie''​ în rezolvare.
  
-**Notă:** va fi necesar să convertiți între un șir de caractere și lista caracterelor componente ale șirului. Pentru aceasta, folosiți predicatul ''​string_chars/​2'',​ care permite conversia în ambele sensuri  + 
-([[https://​www.swi-prolog.org/​pldoc/​doc_for?​object=string_chars/​2|documentație]]).+**Notă:** va fi necesar să convertiți între un literal/șir de caractere și lista caracterelor componente ale literalului. Pentru aceasta, folosiți predicatul ''​atom_chars/​2'',​ care permite conversia în ambele sensuri  
 +([[https://​www.swi-prolog.org/​pldoc/​doc_for?​object=atom_chars/​2|documentație]])
 + 
 +De exemplu: 
 +<code Prolog>​ 
 +?- atom_chars('​hel lo', L). 
 +L = [h, e, l, ' ', l, o]. 
 + 
 +?- atom_chars(S,​ ['​h',​ '​e',​ '​l',​ '​l',​ '​o',​ ' ', '​w',​ '​o',​ '​r',​ '​l',​ '​d'​]). 
 +S = 'hello world'​. 
 +</​code>​ 
 + 
 +==== Testare ==== 
 + 
 +Pentru lucru, puteți încărca în Prolog direct fișierul ''​integrame.pl''​. 
 + 
 +Pentru testare, folosiți interogarea ''​vmtest.''​ în consola Prolog. 
 + 
 +**Notă:** Prolog permite testarea faptului că anumite interogări sunt adevărate, dar și că anumite interogări sunt false, sau se obțin pentru ele zero soluții. Testerul face inițial o verificare și dacă niciunul dintre testele pozitive nu reușește, va afișa direct "​Nerezolvat"​ pentru întregul set respectiv de teste. Astfel: **dacă ați implementat un anumit predicat, dar testerul vă afișează "​Nerezolvat"​**,​ decomentați linia ''​%test_mode(detailed).''​ de la începutul fișierului ''​integrame.pl''​ (sau adăugați ''​test_mode(detailed).''​ în sursa voastră). Pe vmchecker, modul //detailed // **nu** este activat.
  
 ==== Etapa 1 ==== ==== Etapa 1 ====
Line 114: Line 156:
 ==== Etapa 3 ==== ==== Etapa 3 ====
  
-[în curând]+În această etapă veți implementa rezolvarea propriu-zisă a integramei. O soluție a integramei este una în care pentru fiecare întrebare este asociat un cuvânt (un cuvânt din vocabular poate fi asociat cel mult unei întrebări) de lungimea potrivită, și care la intersecțiile cu oricare alt spațiu are aceeași literă cu cuvântul asociat cu întrebarea corespunzătoare acelui spațiu.
  
 +Trebuie implementate predicatele:​
 +  * ''​solutii_posibile/​2'',​ care determină toate cuvintele (ca liste de litere) care pot fi soluție pentru fiecare întrebare.
 +  * ''​rezolvare/​2'',​ care determină în al doilea argument o soluție pentru integramă.
 +    * o soluție este reprezentată ca o listă de perechi întrebare-răspuns,​ unde atât întrebarea (identificată prin textul ei) cât și răspunsul sunt literali/​atomi,​ ca în fișierul ''​solutie.pl''​.
 +    * ca bonus poate fi considerată oricare dintre următoarele două proprietăți (cealaltă va fi parte din punctajul nominal):
 +      * tema funcționează într-un timp acceptabil (5 secunde) și pentru cazuri în care vocabularul este mai extins;
 +      * predicatul ''​rezolvare''​ produce un număr corect de soluții (2 soluții pentru integrama 0 și câte o singură soluție pentru celelalte integrame)
 +    * (adică, dacă implementați doar una dintre cele două proprietăți,​ aveți punctaj nominal; dacă implementați pe ambele, aveți și bonus)
  
  
 +==== Punctaje =====
  
 +  * pentru etapa 1 puteți acumula maxim 3.6 puncte
 +  * pentru etapa 2 puteți acumula maxim 3.6 puncte
 +  * pentru etapa 3 puteți acumula maxim 4.8 puncte
 +  * în total puteți acumula maxim 12 puncte.
 +
 +
 +===== Observații ====
 +
 +  * Lucrați numai în fișierul ''​integrame.pl''​
 +  * Nu utilizați predicatul ''​solutie''​
 +  * Nu lăsați variabile singleton în rezolvare.
  
 ===== Resurse ===== ===== Resurse =====
   * {{.prolog:​schelet.zip|schelet de cod}}   * {{.prolog:​schelet.zip|schelet de cod}}
 +  * {{.prolog:​schelet2.zip|schelet de cod pentru etapa 2}}
 +  * {{.prolog:​schelet3.zip|schelet de cod pentru etapa 3}}
 +
 +//Notă: practic, diferența între fișiere este doar fișierul ''​pointsN.pl''​ utilizat, pentru a activa testele pentru diverse etape.//
  
 ===== Changelog ===== ===== Changelog =====
   * 8.05 - Publicare etapele 1 și 2.   * 8.05 - Publicare etapele 1 și 2.
 +  * 12.05 (22:30)
 +    * publicare vmchecker etapa 1
 +    * modificare structură testare, fără efect asupra implementării temei (fișierul ''​pointsN.pl''​ corespunzător fiecărei etape).
 +    * includere detalii despre modul de testare
 +    * includere detalii despre modul de testare "//​detaliat//"​
 +    * clarificare legată de reprezentarea elementelor din integramă ca literali, nu ca stringuri, și utilizarea predicatului ''​atom_chars''​ (în loc de ''​string_chars''​)
 +    * adăugare în enunț a detalierii structurii unei integrame
 +  * 18.05 (20:00)
 +    * publicare vmchecker pentru etapele 2 și 3, publicare etapa 3
 +    * modificare test ''​completare|d''​ pentru a verifica corect și cazurile în care ''​completare''​ întoarce un număr mare de soluții.
 +    * corectare mențiuni despre //​stringuri//​ în fișierul ''​integrame.pl''​
 +    * adăugare documentare corectă (în termeni de "​tipuri"​ ale argumentelor) pentru bonus pentru predicatele ''​lungime''​ și ''​intersectie''​.
 +  * 23.05
 +    * modificare structură punctaje astfel încât la fiecare etapă se primesc doar punctele de pe etapa respectivă (vedeți [[#​Punctaje]])
 +    * fix bug în care era posibil ca modul de test detaliat să fie activat pe vmchecker
  
pp/21/teme/prolog-integrame.1620504159.txt.gz · Last modified: 2021/05/08 23:02 by andrei.olaru
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