BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2001/2002-es tanév, őszi félév
|
? - - - - - - - - - ? - - ? - - - - ? - - - - - - - - - - - - - ? - - ? |
5 - - - - - - - - - 3 - - 2 - - - - 1 - - - - - - - - - - - - - 4 - - 6 |
|
1. ábra. Egy feladvány | 2. ábra. A feladvány (egyetlen) megoldása |
lepeget
néven olyan Prolog-eljárást, ill. SML-függvényt,
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 Sor-Oszlop
párokból
álló lista, amelynek elemei egy-egy kitöltendő rácspont (kérdőjel) helyét
adják meg. A listáról feltételezhető, hogy az elemei lexikografikusan
növekvő sorrendben vannak. Az 1. ábrán bemutatott feladvány esetén például
a Prolog-eljárás bemenő paramétere:
[1-1, 2-5, 3-2, 4-1, 6-3, 6-6]
A Prolog-eljárás kimenő paramétere egy olyan - az előbbivel megegyező hosszúságú - lista, amely minden egyes koordinátához hozzárendeli a megfelelő rácspontba írandó számot. A 2. ábrán látható megoldást írja le például az alábbi lista:
[5, 3, 2, 1, 4, 6]Az SML-függvény paramétere egy
(Sor, Oszlop)
párokból álló lista, amelynek elemei egy-egy kitöltendő rácspont (kérdőjel)
helyét adják meg. A listáról feltételezhető, hogy az elemei
lexikografikusan növekvő sorrendben vannak. Az 1. ábrán bemutatott
feladvány esetén például az SML-függvény paramétere:
[(1,1), (2,5), (3,2), (4,1), (6,3), (6,6)]Az SML-függvény eredménye az előbbivel megegyező hosszúságú listák olyan listája, amelynek elemei egy-egy megoldást írnak le úgy, hogy nincs közöttük két azonos, és együtt az összes megoldást megadják (a sorrendjük tetszőleges). Az egy-egy megoldást leíró listák minden egyes koordinátához hozzárendelik a megfelelő rácspontba írandó számot. Az 1. ábrán látható feladványnak egyetlen megoldása van, ez a 2. ábrán látható, és az alábbi lista írja le:
[[5, 3, 2, 1, 4, 6]]
lepeget/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 koord ---> int-int. % :- type racspontok == list(koord). % :- type kitoltes == list(int). % :- pred lepeget(racspontok::in, kitoltes::out).
A lepeget
függvény paraméterének és eredményének típusát a
következő SML-típusdefiníciók írják le.
structure TLepeget = struct type koord = int * int type racspontok = koord list type kitoltes = int list end
signature Lepeget = sig (* lepeget Rs = az 1..n számok összes olyan permutációja listaként ábrázolva, amelynek elemeit rendre egy rács Rs-beli rácspontjaiba írva a megadott távolságkritériumnak eleget tevő elrendezést kapunk *) val lepeget : TLepeget.racspontok -> TLepeget.kitoltes list end
A keretprogram bemenete egy olyan szöveges állomány, amelynek egyetlen
sorában a rács kitöltendő rácspontjainak koordinátái állnak (Sor,
Oszlop)
alakban, egy-egy szóközzel elválasztva.
(1,1) (2,5) (3,2) (4,1) (6,3) (6,6) |
3. ábra. A bemenő állomány tartalma az 1. ábrán látható feladvány esetén |
A keretprogram kimenete a 2. ábrán bemutatotthoz hasonló tartalmú szöveges állomány.
A Prolog-keretprogram három eljárást exportál:
lepeget_be(file::in, racspontok::out)
lepeget_ki(file::in, racspontok::in, kitoltes::in)
megold(file::in, file::in)
lepeget/2
eljárásra.
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 irathatunk ki adatokat.
Egyébként a megadott nevű állományba írunk, ill. állományból olvasunk.
Az SML-keretprogram három függvényt exportál:
signature KLepeget = sig val lepeget_be : string -> TLepeget.racspontok val lepeget_ki : string * TLepeget.racspontok * TLepeget.kitoltes list -> unit val megold : string * string -> string end
lepeget_be f
f
szöveges állományból beolvasott adatokból képzett
feladvány.
lepeget_ki(m, fl, mss)
fl
feladvány és az mss
megoldáslista
alapján az összes megoldást kiírja az m
szöveges állományba.
megold(f, m)
f
szöveges állományból és
kiírja az összes megoldást az m
szöveges állományba. Ehhez
természetesen szüksége van a Lepeget.lepeget
függvényre.
Eredménye az f
nevet, a megoldások számát és a futási időt
másodpercben tartalmazó füzér.
/dev/stdin
, ill. a /dev/stdout
, MS-DOS alatt
mindkét esetben a con
állománynév megadásával.
A két programhoz közös dokumentációt készítsen - vagy magyarul, vagy angolul. A dokumentáció tartalma legalább a következő legyen:
A dokumentációt elektronikus formában adja be, HTML, esetleg ASCII formátumban.
bash
szkript
segítségével.
A programok és az elektronikus dokumentáció beadási határideje 2001. december 10-e, hétfő, 24 óra. A vizsgaosztályzatban a határidőre beadott nagyfeladat eredményét 15%-os súllyal vesszük figyelembe. A hibátlan nagyfeladatot beadók SML- és/vagy Prolog-programjukkal létraversenyben vesznek részt. A leggyorsabban futó SML-, ill. Prolog-programokra - helyezési számuktól függően - külön-külön 30 és 2 közötti pluszpont kapható, a féléves összpontszámhoz a kapott összegnek a negyedét adjuk hozzá.
A programok készülhetnek MS DOS vagy MS Windows alatt is, de Unix (linux) alatt is működniük kell.