A lakótelepes feladatnál működik a programom, de lassú, az utolsó, 7x7-es tesztesetet már nem tudja időben megcsinálni. Azt szeretném megkérdezni, hogy ezt milyen módon érdemes optimalizálni. Jelenleg ez a "latszam" függvényem, amit ugye sokat használ:
latszam([], 0).
latszam([H|T], K) :- K1 #= K-1, nez(T, K1, H).
nez([H|T], K, Max) :- K #> 0, H #> Max, K1 #= K-1, nez(T, K1, H).
nez([H|T], K, Max) :- K #> 0, H #=< Max, nez(T, K, Max).
nez(L, 0, Max) :- nemnagyobb(L, Max).
nemnagyobb([], _).
nemnagyobb([H|T], Max) :- H #=< Max, nemnagyobb(T, Max).
Ezzel lehet gond?
Igen, ez az eljárás választási pontot hoz létre, ami nagyon nem hatékony, és a feladat kiírásában is tiltva van.
A nez/3 eljárásod hasonló szerkezetű, mint a pontosan/3 eljárás (171. dia), amit ezen a hivatkozott dián még reifikáció nélkül írtunk meg.
Vagy egy ilyen példához ezt a függvényt felhasználói korlátként kellene megírni, mint ahogy az utolsó óra végén az "exactly"-t is átírtuk? Úgy gyorsabb lenne?
Igen ez is jó lehet, de elég nagy munka. Elég ha átírod úgy, hogy reifikációt használjon (lásd pl. pontosan3/3 a 182. dián). Tipp: alaposan tanulmányozd a 138. dia legelső bajuszát, ahol a clpfd által kezelt aritmetikai függvényeket soroljuk fel.
Illetve még egy kérdésem lenne, hogy az is baj, ha egy teszteset lefut, csak részekben adja meg a választ, és így hibásnak írja a tesztet? Erre gondolok:
expected success,
got 3-fold_success
A fenti "latszam" függvény ezt produkálja erre a hívásra:
length(L,4),domain(L,1,4),
A három lehetőségben különböző módon szűkített változó-csoportok vannak.
Igen, ez a teszteset pont azt hivatott ellenőrizni, hogy létrehozol-e választási pontot, ami a kiírásban tiltva van.