Lucrarea nr. 10
Probleme de tip enigma
Exista anumite probleme ale caror specificari nu sprijina crearea unor
proceduri care pornind de la specificare sa determine solutia. Aceste date
servesc mai mult la testarea unei solutii presupuse. Rezolvarea acestor
tipuri de probleme porneste cu generarea unei solutii posibile, urmand
ca aceasta sa fie testata daca satiface sau nu cerintele.
Consideram urmatoarea problema:
Intr-o strada sint cinci case. Despre locatari stim urmatoarele:
-
englezul sta in casa rosie
-
cel care sta in casa verde bea cafea
-
ucrainianul bea ceai
-
cel care sta in casa galbena fumeaza kent
-
cel care bea lapte sta in casa din mijloc
-
norvegianul sta in prima casa din stanga
-
cel care fumeaza marlboro sta langa persoana care are o vulpe
-
cel care fumeaza kent sta langa cel care are un cal
-
cel care bea juice fumeaza carpati
-
japonezul fumeaza pipa
-
norvegianul sta langa casa albastra
-
spaniolul are un caine
-
cel care are un sarpe fumeaza camel
-
casa gri este langa casa verde
-
cel care are o pisica si cel care bea vodka stau in casele laterale
Predicatul care rezolva problema se reduce la a genera o configuratie de
case si a testa daca aceasta este corecta, completand variabilele inca
nelegate. In aceasta situatie generarea tuturor solutiilor complete este
lenta, datorita numarului mare de configuratii posibile. O solutie care
porneste cu "cinci case goale si nevopsite" este data in fisierul
"enigma.pl".
Probleme:
-
Consideram un traseu pe care se afla orasele A,B,C,D intr-o ordine necunoscuta.
Stim ca A se gaseste la o departare mai mare de C decit C de D, iar B este
mai aproape de C decit de D. Care este ordinea oraselor?
-
Imparatul, pentru a da posibilitate prizonierului sa scape, l-a dus in
fata a doua usi, care puteau sa contina un tigru sau o printesa. In plus
pe fiecare usa se afla o inscriptie. Trebuie aflat ce se gaseste in fiecare
celula. Citeva din situatiile create de imparat:
-
Cazul 1:
-
prima usa: in aceasta celula se afla o printesa iar in cealalta
un tigru
-
a doua usa: intr-una din celule se gaseste un tigru iar in cealalta
o printesa
-
imparatul adauga: una din inscriptii este adevarata iar cealalta
falsa
-
Cazul 2:
-
prima usa: in aceasta celula se afla un tigru sau in cealalta o
printesa
-
a doua usa: in cealalta celula se gaseste o printesa
-
imparatul: amindoua afise mint sau amindoua spun adevarul
-
Cazul 3:
-
ambele usi: ambele celule contin printese
-
imparatul: prima usa spune adevarul daca inauntru se afla o printesa
si minte daca se afla un tigru, iar a doua usa spune adevarul daca inauntru
se afla un tigru si minte daca se afla o printesa
Sugestie pentru generare:
generate :- thing(T1), thing(T2),
retractall(is(_,_)),
assert(is(T1,1)), assert(is(T2,2)).
thing(princess). thing(tiger).
-
Completati un careu de 3x3 cu cifrele 1-9 respectand urmatoarele reguli:
-
cifrele adiacente ca valoare trebuie sa fie adiacente si in careu;
-
daca consideram ca trei cifre orizontale formeaza un numar, atunci
daca adunam numarul din prima linie cu cea din a doua, rezultatul trebuie
sa fie numarul din linia treia.