BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak
Nappali tagozat
2000. őszi félév

Deklaratív programozás

Tudnivalók a kis házi feladatok beadásáról

2000. december 1.

A kis házi feladat beadása nem kötelező.

A programot tömörítve, elektronikus levélben kell beküldeni. A beküldéshez egy bash szkriptet kell használni. A szkriptet futtatni a

    bash dpkhfbe.00a
paranccsal lehet (feltéve, hogy ezen a néven mentettük el).

Figyelem! Az ural2 szerveren a /usr/local/bin könyvtárban található a bash program.

A szkript elindulaskor elmagyarázza a teendőket (mi legyen az adott könyvtárban, milyen néven stb.). Mielőtt valaki hibára panaszkodna, győződjön meg róla, hogy a hiba az ural2.hszk.bme.hu szerveren is reprodukálható.

A programok készülhetnek MS DOS vagy MS Windows alatt is, de Unix (linux) operációs rendszer alatt is működniük kell.

A feladat

A feladat egy mátrix adott blokkjának meghatározása. Egy blokkot két pár ad meg, az első pár a sorait, a második az oszlopait. A párok első tagja a kívánt intervallum első elemét a második az utolsó elemét határozza meg. A sorokat és az oszlopokat 0-tól kezdve sorszámozzuk. A mátrixot a sorai listájaként ábrázoljuk, a sorok az elemek listái.

A segédeljárásokat feltétlenül lássa el fejkommenttel!

Prolog

Törekedjék arra, hogy a megoldás hatékony legyen (az eljárások legyenek jobbrekurzívak, append-et, reverse-et ne használjon)! Vigyázzon arra is, hogy a megoldás ne sikerüljön többszörösen! Ha a megadott blokk nem letezik, hiúsuljon meg!

% :- matrix(T)   == list(row(T)).
% :- type row(T) == list(T).
% :- type slice  == int-int. % zero-based indexing, inclusive intervals
% block(Mátrix, Sorok, Oszlopok, Blokk): a Mátrix mátrix egy blokkja, amelyet
%   a Sorok pár és az Oszlopok pár határoz meg.
% :- pred block(matrix(T)::in, slice::in, slice::in, matrix(T)::out).

Példák

| ?- block([[1,2,3],[4,5,6]], 1-2, 0-2, B).
no
{source_info}
| ?- block([[1,2,3],[4,5,6]], 0-1, 1-2, B).
B = [[2,3],[5,6]] ? ;
no
{source_info}
| ?- block([[1,2,3],[4,5,6]], 0-3, 1-2, B).
no
{source_info}
| ?- block([[1,2,3],[4,5,6]], 0-0, 0-0, B).
B = [[1]] ? ;
no
| ?- 

SML

Törekedjék arra, hogy a megoldás hatékony legyen (az eljárások legyenek jobbrekurzívak, @-ot, rev-et ne használjon)! Ha a megadott blokk nem letezik, dobjon kivételt!

type 'a row    = 'a list
type 'a matrix = 'a row list
type slice     = int * int (* zero-based indexing, inclusive intervals *)

(* block (matrix, sorok, oszlopok) = a matrix mátrix egy blokkja, amelyet
   a sorok pár és az oszlopok pár határoz meg.
   block: 'a matrix * slice * slice -> 'a matrix
 *)

Példák

- block([[1,2,3],[4,5,6]], (1,2), (0,2));
! Uncaught exception: 
! Subscript

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

- block([[1,2,3],[4,5,6]], (0,3), (1,2));
! Uncaught exception: 
! Subscript

- block([[1,2,3],[4,5,6]], (0,0), (0,0));
> val it = [[1]] : int list list
Figyelem! A hibás híváskor keletkező kivétel akármi lehet, nem kell pont Subscript-nek lennie.

Egyéb követelmények és tudnivalók

A Prolog megoldást khf-pl1.pl néven, az SML megoldást khf-ml1.sml néven, külön-külön kell beküldeni. A beadási határidő 2000. december 1., péntek, 24:00 óra.

A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatért plusz 1 pont jár (a 100 pontból).