Pallos Peter <pallosp(a)freeweb.hu> writes:
Hello!
Megoldottam a gyakorló feladatok közül a felhõkarcolósat (4. oldal, 4.
feladat).
Az én megoldásom kicsit bõvebb az emelkedõ függvényhez képest: a
rejtvény egy sorára felveszi az összes szükséges korlátot.
A problémám az, hogy a rowbnd([A,B,C,D], 1, 3]) hívás semmilyen
szûkítést sem végez, csak a cimkézés szakaszában derül ki, hogy a bal
oldali épület 4 magasságú.
Kíváncsi vagyok a hivatalos megoldásra - hogyan lehetne bevetni a
tanult aritmetikai és kombinatorikus korlátokat, leegyszerûsítve és
hatékonyabbá téve a feladatot. Például a maximumszámítást elég
körülményesnek tartom három listával, és a reifikációval való
trükközéssel. Nincs olyan beépített korlát, ami segíthetne?
A vizsgafeladat reszre adott megoldasod szinte tokeletes, egyetlen
szepseghiba, hogy nem kellett volna a max fuggvenyt beprogramoznod, mert
azt a SICStus clpfd konyvtar tamogatja:
visible([], [], _, []).
visible([H|HT], [M|MT], L, [V|VT]) :-
H #> L #<=> V,
% M #= V*H + (1-V)*L, % M=max(H,L)
M #= max(H,L),
visible(HT, MT, M, VT).
A bovebb feladvanynal (rowbnd predikatum) a szokasos gond jelentkezik: a
visible/4-beli korlatok (+ a sum) kideritik, hogy csak a baloldali epulet
lehet lathato (a sum [1,0,0,0]-ra helyettesiti a parameteret), de ez nem
okoz semmilyen valtozast a tarban, igy errol az all_distinct nem ertesul.
Redundans korlattal lehetne valamit tenni, de kapasbol nem jut eszembe
semmi. A kombinatorikus korlatokban az assignment-nek ujabban van egy cost
opcioja (az eloadasfoliakban ez nincs benne), lehet, hogy azzal lehet
valamit kezdeni. A holnapi konzultacion beszelhetunk ezekrol.
-Peter