This shows you the differences between two versions of the page.
pp:21:teme:prolog-integrame [2021/05/12 22:37] andrei.olaru [Descriere generală] |
pp:21:teme:prolog-integrame [2021/05/23 17:25] (current) andrei.olaru [Changelog] |
||
---|---|---|---|
Line 71: | Line 71: | ||
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 variabil a ''X'' la o structură de forma: | + | În temă, predicatul ''integrama(0, X)'' va lega variabila ''X'' la o structură, descriind integrama de mai sus, de forma: |
<code Prolog> | <code Prolog> | ||
- | X = integ(5,5,[ | + | X = integ(5,5,[ <- înălțimea și lățimea integramei, în număr de celule |
- | ((0,0),x), | + | ((0,0),x), <- celulă neagră, la coordonata 0,0 |
((0,4),x), | ((0,4),x), | ||
((1,4),x), | ((1,4),x), | ||
Line 82: | Line 82: | ||
((4,4),x), | ((4,4),x), | ||
((0,1),x), | ((0,1),x), | ||
- | ((1,1),[('Negativ',j,0),('Afirmativ',d,1)]), | + | ((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)]), | + | ((0,2),[('Al doilea număr',j,2)]), <- celulă cu o singură întrebare, în jos |
((0,3),[('Primii 3 din artă',j,3)]), | ((0,3),[('Primii 3 din artă',j,3)]), | ||
((1,0),x), | ((1,0),x), | ||
- | ((2,0),[('Din care plouă',d,4)]), | + | ((2,0),[('Din care plouă',d,4)]), <- celulă cu o singură întrebare, la dreapta |
((3,0),[('Când nu îmi amintesc',d,5)]), | ((3,0),[('Când nu îmi amintesc',d,5)]), | ||
((4,0),x), | ((4,0),x), | ||
Line 92: | Line 92: | ||
((4,2),x), | ((4,2),x), | ||
((4,3),x)], | ((4,3),x)], | ||
- | ['DA','NU','NOR','ART','UIT','DOI'] | + | ['DA','NU','NOR','ART','UIT','DOI'] <- setul de cuvinte disponibile pentru a completa integrama |
) | ) | ||
</code> | </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 106: | 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 117: | Line 119: | ||
- | **Notă:** va fi necesar să convertiți între un șir de caractere și lista caracterelor componente ale șirului. Pentru aceasta, folosiți predicatul ''atom_chars/2'', care permite conversia în ambele sensuri | + | **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]]). | ([[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 ==== | ==== Testare ==== | ||
Line 146: | 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 | ||