satrak néven olyan Prolog-eljárást, amely egy
feladvány összes megoldását előállítja!
A Prolog-eljárásnak két paramétere van. Első (bemenő) paramétere a feladványt, második (kimenő) paramétere a megoldást írja le. Az eljárásnak a visszalépések során minden megoldást pontosan egyszer kell kiadnia. Ha a feladványnak nincs megoldása, az eljárás hiúsuljon meg.
A Prolog-eljárás bemenő paramétere egy
satrak(Ss, Os, Fs)
Ss a sátrak soronkénti számát tartalmazó lista,
Os a sátrak oszloponkénti számát tartalmazó lista és
Fs a fák sorát (i) és oszlopát
(j) azonosító i-j párok lexikografikusan rendezett
listája.
Az 1. ábrán bemutatott feladvány esetén például a Prolog-eljárás bemenő paramétere:
satrak([1,1,0,3,0], [1,0,2,0,2], [1-2,3-3,3-5,5-1,5-5])
A Prolog-eljárás kimenő paramétere egy olyan lista, amely - a fák Fs-beli
megadási sorrendjét követve - a sátrak saját fájukhoz viszonyított helyzetét írja le. Egy
sátor helyzetét a megfelelő égtájat jelölő betűvel adjuk meg:
w (west) - a sátor a saját fájától nyugatra áll,
| n (north) - a sátor a saját fájától északra áll,
|
e (east) - a sátor a saját fájától keletre áll,
| s (south) - a sátor a saját fájától délre áll.
|
A 2. ábrán látható megoldást írja le például az alábbi lista:
[e,s,n,n,n]
Feltételezheti, hogy feladvány sorainak és oszlopainak száma legfeljebb 999 lehet.
satrak/2 Prolog-eljárás paramétereinek típusát a következő - megjegyzésként
megadott - Prolog-típusdefiníciók írják le.
% :- type fLeiro ---> satrak(sSzS, sSzO, list(parc)). % :- type sSzS == list(int). % :- type sSzO == list(int). % :- type parc == int-int. % :- type irany ---> n % észak % ; e % kelet % ; s % dél % ; w. % nyugat % :- type sHelyek == list(irany). % :- pred satrak(fLeiro::in, sHelyek::out).
Megoldásában tetszőleges Prolog-könyvtárakat használhat, kivéve a
clpfd, clpq, clpr, clpb,
chr és atts könyvtárakat: az ezeket
felhasználó megoldásokat nem fogadjuk el, így a létraversenyben sem vehetnek részt,
és megajánlott jegyet sem kaphatnak. Hasonlóképpen tiltott a
mellékhatásos beépített eljárások, így az
assert, retract, bb_put, bb_get
stb. használata.
Programját keretprogram segítségével próbálhatja ki. A keretprogramot a beadáskor használthoz hasonló tesztesetekkel együtt az alábbi helyről töltheti le:
A nagy házi feladatok teszteléséhez és értékeléséhez a keretprogrammal azonos specifikációjú programokat fogunk használni. Olvassa el a README.txt-t!
A ksatrak.pl Prolog-keretprogram a következő eljárásokat
exportálja:
% :- pred satrak_be(file::in, sspec::out).% :- pred satrak_ki(file::in, ssol::in).% :- pred megold(file::in, file::in).satrak/2 eljárást.% :- pred stopper(file::in, file::in).megold/2, de a végén kiírja a feladvány nevét, a
megoldások számát és a futási időt is.
% :- pred teljes_teszt(int::in).
tests könyvtárban levő összes testXXXd.txt
tesztállomány esetén:
testXXXs.txt állományban megadott
megoldáshalmazt kapta,
megold/2) kiírja az eredményt a tests_out
könyvtár testXXXt.txt nevű állományába.
XXX egy tetszőleges hosszúságú
számjegysorozatot jelöl.
Ezt az eljárást Eisenberger András ültette át Prologra.
A keretprogram felhasználja a file típust:
% :- type file == atom.
A file típusú paraméterben a user atomot megadva
a terminálról vihetünk be, ill. a terminálra írathatunk ki adatokat.
Egyébként a megadott nevű fájlba írunk, ill. fájlból olvasunk.
Használat: saját programját a
satrak.pl nevű fájlba tegye, különben a
ksatrak.pl keretprogram nem találja meg. Ezután indítsa el a
SICStus rendszert, és töltse be a keretprogramot. Példa:
| ?- [ksatrak].
% compiling /home/szeredi/tmp/ksatrak.pl...
% module ksatrak imported into user
(...)
% compiled /home/szeredi/tmp/ksatrak.pl in module ksatrak, 30 msec 78104 bytes
yes
| ?- stopper('teszt0.txt','teszt0.sol').
A stopper/2, ill. megold/2 eljárások meghívása a
satrak.pl programot automatikusan betölti (ha szükséges),
ezért ennek módosításakor nem kell sem a SICStus interpretert
újraindítania, sem a keretprogramot újra betöltenie.
| DP Admin: dvacakrobotjaitoknakp@iit.bme.hu | Vissza az elejére / Back to the top |