BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak
Nappali tagozat
2007/2008-as tanév, tavaszi félév

Deklaratív programozás

2. kis házi feladat: Sudoku-mátrixból hiányzó értékek előállítása

1.0 változat
Utolsó módosítás: 2008-03-16
Kiadás: 2008-03-17
Beadási határidő: 2008-04-07

A feladat

A feladat a féléves nagy házi feladatban specifikált Sudoku-táblából azoknak a megengedett mezőértékeknek a meghatározása, amelyek egy adott mezőt tartalmazó sor, oszlop és cella egyikében sem fordulnak elő. Ha a Sudoku-táblában k a cellák oldalhossza, akkor a megengedett mezőértékek az 1..k*k közötti egész számok.

A Sudoku-táblát a nagy házi feladatban specifikált Prolog-struktúrával, illetve SML-párral adjuk meg.

A vizsgálandó sort, oszlopot és cellát a Sudoku-tábla adott mezőjének a koordinátáival határozzuk meg. A Sudoku-tábla bal felső mezőjének koordinátája: (1,1). Az eredmény a keresett - azaz az adott Sudoku-táblában megengedett, de az adott sorból, oszlopból és cellából hiányzó - mezőértékeket tartalmazó lista.

SML-specifikációk

Írjon SML-függvényt ertekek néven, amely egy Sudoku-táblából előállítja a keresett mezőértékek listáját. Ha a megadott paraméterekkel a lista nem állítható elő, az eredmény az üres lista legyen.
(* type col = int
   type row = int
   ertekek : (sspec, col, row) -> field list 
   ertekek (t, x, y) = a t Sudoku-tábla (x,y) koordinátájú mezőjével meghatározott
                       sorából, oszlopából és cellájából hiányzó mezőértékek listája
*)

Prolog-specifikációk

Írjon Prolog-eljárást ertekek/4 néven, amely egy Sudoku-táblából előállítja a keresett mezőértékek listáját. Ha a megadott paraméterekkel a lista nem állítható elő, az eljárás hiúsuljon meg.
% :- type col  == int.
% :- type row  == int.
% :- pred ertekek(sspec::in, col::in, row::in, list(field)::out).
% ertekek(T,X,Y,M), ahol
%   T az sspec specifikációnak megfelelő Sudoku-tábla,
%   X a col, Y a row típusnak megfelelő koordináta,
%   M a list(field) típusnak megfelelő mezőlista.

Példák

| ?- ertekek(s(3, [[0,2,3, 4,1,0, 5,8,0],
                   [0,7,8, 0,0,0, 0,2,1],
                   [0,0,5, 7,2,0, 0,3,9],

                   [0,8,2, 9,6,1, 0,4,0],
                   [0,9,0, 5,0,4, 0,1,0],
                   [0,6,0, 2,7,3, 9,5,0]]), 5, 2, M).
M = [3, 5, 9] ? ;
no
| ?- ertekek(s(3, [[0,2,3, 4,1,0, 5,8,0],
                   [0,7,8, 0,0,0, 0,2,1],
                   [0,0,5, 7,2,0, 0,3,9],

                   [0,8,2, 9,6,1, 0,4,0],
                   [0,9,0, 5,0,4, 0,1,0],
                   [0,6,0, 2,7,3, 9,5,0]]), 2, 5, M).
M = [3] ? ;
no
| ?- ertekek(s(2, [[0,2, 3,4],
                   [0,1, 3,0],

                   [0,0, 1,1],
                   [0,1, 2,3],

                   [4,0, 1,0],
                   [3,3, 3,0]]), 2, 2, M).
M = [4] ? ;
no
| ?- ertekek(s(2, [[0,2, 3,4],
                   [0,1, 3,0],

                   [0,0, 1,1],
                   [0,1, 2,3],

                   [4,0, 1,0],
                   [3,3, 3,0]]), 4, 4, M).
M = [] ? ;
no
- ertekek((3, [[0,2,3, 4,1,0, 5,8,0],
               [0,7,8, 0,0,0, 0,2,1],
               [0,0,5, 7,2,0, 0,3,9],

               [0,8,2, 9,6,1, 0,4,0],
               [0,9,0, 5,0,4, 0,1,0],
               [0,6,0, 2,7,3, 9,5,0]]), 5, 2);
> val it = [3, 5, 9] : int list
- ertekek((3, [[0,2,3, 4,1,0, 5,8,0],
               [0,7,8, 0,0,0, 0,2,1],
               [0,0,5, 7,2,0, 0,3,9],

               [0,8,2, 9,6,1, 0,4,0],
               [0,9,0, 5,0,4, 0,1,0],
               [0,6,0, 2,7,3, 9,5,0]]), 2, 5);
> val it = [3] : int list
- ertekek((2, [[0,2, 3,4],
               [0,1, 3,0],

               [0,0, 1,1],
               [0,1, 2,3],

               [4,0, 1,0],
               [3,3, 3,0]]), 2, 2);
> val it = [4] : int list
- ertekek((2, [[0,2, 3,4],
               [0,1, 3,0],

               [0,0, 1,1],
               [0,1, 2,3],

               [4,0, 1,0],
               [3,3, 3,0]]), 4, 4);
> val it = [] : int list

Tudnivalók a beadásról

A programot az Elektronikus Tanársegéddel kell majd beadni, a HF beadás menüpont alatt. A beadási határidő 2008. április 7., hétfő 24:00.

A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatokért plusz 1-1 pont jár.

Gyakorló feladatok

A tantermi gyakorlatokon és otthon a következő kisebb feladatok megoldását javasoljuk.
  1. Az l1 és az l2 lista l3 = l1 - l2 különbséglistájának előállítása. (Vagyis l3 az l1-nek azokat az elemeit tartalmazza, amelyek l2-ben nem fordulnak elő). Az ismétlődő elemek kezelésére többféle módszert is alkalmazzon.
  2. Egy sorfolytonosan tárolt mátrix adott mezőjét befoglaló k-méretű cella elemeit sorfolytonosan tartalmazó lista előállítása.
  3. Nem rendezett listaként tárolt halmazok metszetének előállítása.
  4. Nem rendezett listaként tárolt halmazok uniójának előállítása.
  5. Nem rendezett listaként tárolt halmazok különbségének előállítása.
  6. Polimorf lista rendezése különféle módszerekkel.

dp@inf.bme.hu