This shows you the differences between two versions of the page.
pp:25:teme:prolog-lightup [2025/05/12 01:22] andrei.olaru |
pp:25:teme:prolog-lightup [2025/05/23 13:24] (current) andrei.olaru |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Data publicării: 12.05.2025 | * Data publicării: 12.05.2025 | ||
- | * Data ultimei modificări: 12.05.2025 (vezi [[#Changelog|changelog]] ) | + | * Data ultimei modificări: 23.05.2025 (vezi [[#Changelog|changelog]] ) |
* [[https://curs.upb.ro/2024/mod/forum/view.php?id=168710|Forum temă]] | * [[https://curs.upb.ro/2024/mod/forum/view.php?id=168710|Forum temă]] | ||
- | * [[https://vmchecker.cs.pub.ro/ui/#PP|vmchecker]] (în curând) | + | * [[https://vmchecker.cs.pub.ro/ui/#PP|vmchecker]] |
===== Obiective ===== | ===== Obiective ===== | ||
Line 90: | Line 90: | ||
* foarte util poate fi predicatul ''%%between(A, B, X)%%'', care poate fi folosit atât pentru a afla dacă ''%%X%%'' este între ''%%A%%'' și ''%%B%%'' (inclusiv), dar și pentru a //genera// numere din intervalul ''%%[A, B]%%''. | * foarte util poate fi predicatul ''%%between(A, B, X)%%'', care poate fi folosit atât pentru a afla dacă ''%%X%%'' este între ''%%A%%'' și ''%%B%%'' (inclusiv), dar și pentru a //genera// numere din intervalul ''%%[A, B]%%''. | ||
* Mai multe hints specifice pentru diversele predicate de implementat găsiți în sursă. | * Mai multe hints specifice pentru diversele predicate de implementat găsiți în sursă. | ||
+ | |||
+ | ===== Etapa 2 ===== | ||
+ | |||
+ | În etapa a doua veți implementa rezolvarea jocului Light Up. O soluție a jocului are următoarele proprietăți: | ||
+ | |||
+ | - Toate pozițiile de pe tablă, care nu sunt pereți, sunt luminate. | ||
+ | - Pentru orice perete cu număr, pe pozițiile vecine ortogonal cu peretele (cele 4 poziții de sus, dreapta, jos, stânga) se află exact numărul necesar de lumini (nici mai mult, nici mai puțin). | ||
+ | - Toate becurile sunt pe poziții care, dacă nu ar fi fost acel bec acolo, nu ar fi fost luminate (un bec nu trebuie să fie luminat de un alt bec). | ||
+ | |||
+ | Veți avea de implementat predicate pentru: | ||
+ | |||
+ | * determinarea numărului de lumini din jurul unui perete. | ||
+ | * verificarea dacă pe o poziție poate fi adăugată o lumină. Acest lucru este posibil dacă: | ||
+ | * poziția nu este ocupată de un perete sau de o lumină. | ||
+ | * poziția nu este luminată de un alt bec. | ||
+ | * pentru toți pereții cu număr cu care este vecină ortogonal poziția, numărul de lumini din jurul peretelui este mai mic decât numărul de pe perete. | ||
+ | * verificarea dacă o soluție este validă (vedeți cele 3 reguli de mai sus). | ||
+ | * rezolvarea unei table. Aici vom folosi mecanismul de backtracking din Prolog și este suficient să avem două reguli: | ||
+ | * dacă tabla este o soluție validă, atunci am terminat | ||
+ | * găsim pe tablă o poziție unde putem pune o lumină, punem o lumină acolo, și căutăm o soluție continuând de la noua tablă. Dacă căutarea eșuează la un moment dat, Prolog se va întoarce și va încerca să pună o lumină într-o altă poziție disponibilă și va continua de acolo, și așa mai departe. | ||
+ | * rezolvarea eficientă a unei table, folosind două euristici simple: alegem să punem lumini în jurul pereților cu numere care au numărul exact egal cu numărul pozițiilor disponibile (unde se pot pune lumini) din jurul peretelui respectiv; și alegem să punem lumini în poziții care nu ar mai putea fi luminate din alte poziții disponibile de pe tablă. | ||
+ | |||
+ | Hints specifice pentru fiecare predicat sunt disponibile în schelet. | ||
===== Testare ===== | ===== Testare ===== | ||
Line 111: | Line 134: | ||
</code> | </code> | ||
- | Pentru rezultate mai detaliate ale testării, linia ''%%%detailed_mode_disabled :- !, fail.%%'' din fișierul ''%%testing.pl%%'' este decomentată. Atenție! În acest caz, este posibil ca punctarea să fie diferită decât rezultatul de pe vmchecker, unde linia este comentată. | + | Pentru rezultate mai detaliate ale testării, linia ''%%%detailed_mode_disabled :- !, fail.%%'' din fișierul ''%%testing.pl%%'' este decomentată. Atenție! În acest caz, este posibil ca punctarea să fie diferită decât rezultatul de pe vmchecker, unde linia este comentată. Dacă rezultatele detaliate nu apar, comentați la loc linia, apelați interogarea ''%%make, check.%%'' apoi decomentați din nou și apelați interogarea ''%%make, check%%'' din nou. |
===== Resurse ===== | ===== Resurse ===== | ||
* [[https://ocw.cs.pub.ro/courses/_media/pp/25/teme/prolog/etapa1.zip|Schelet etapa 1]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/25/teme/prolog/etapa1.zip|Schelet etapa 1]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/_media/pp/25/teme/prolog/etapa2.zip|Schelet etapa 2]] | ||
===== Changelog ===== | ===== Changelog ===== | ||
* 12.05 -- enunț | * 12.05 -- enunț | ||
+ | * 14.05 -- Adăugare comentariu: ''%%is_free%%'' întoarce fals dacă este deja o lumină acolo. | ||
+ | * 14.05 -- teste și vmchecker | ||
+ | * 17.05 -- publicare etapa 2 | ||
+ | * 21.05 -- schimbare ordine în directions/1 și completare comentariu solve_plus/2 (primul criteriu), adăugare al treilea criteriu. | ||
+ | * 21.05 -- publicare teste etapa 2 | ||
+ | * 23.05 -- uniformizare ordine direcții în predicatele neighbor, delta | ||
+ | * 23.05 -- ajustare teste pentru a preîntâmpina satisfacerea testelo cu soluții triviale. | ||
+ | |||