BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus alapszak |
Nappali tagozat
2008/2009-es tanév, tavaszi félév
|
Legyen adott egy Mx mátrix és egy f függvény, amely a mátrix minden eleméhez egy számértéket rendel. Jelölje min(f, Mx) az f függvény által az Mx mátrix elemein felvett minimális értéket. Az Mx mátrix azon elemeit nevezzük f-minimálisoknak, amelyekhez az f függvény a min(f, Mx) értéket rendeli.
A feladat egyrészt a min(f, Mx) érték előállítása, másrészt az Mx mátrix f-minimális elemeinek a meghatározása. A mátrix ezen elemeit egy hármassal jellemezzük, amelynek a tagjai: az x koordináta (az oszlop száma, 1-től számozva), az y koordináta (a sor száma, 1-től számozva), a mátrix adott eleme. A feladatot megoldó függvénynek, illetve eljárásnak az f-minimális elemeket leíró hármasok listáját kell előállítania, mégpedig a mátrix sorfolytonos ábrázolásának megfelelő sorrendben.
Írjon Erlang-függvényt matrix_min/2
néven, amelynek bemenete
egy listák listájaként megadott mátrix és egy F
függvény. A
függvény eredménye egy olyan pár legyen, amelynek első tagja a függvény
által a mátrix elemein felvett minimális érték, második tagja pedig
az F
-minimális elemeket jellemző hármasok listája!
%% @type xcoord() = integer().
%% @type ycoord() = integer().
%% @type value() = any().
%% @type triple() = {xcoord(),ycoord(),value()}.
%% @type fmin() = value() -> integer().
%% @spec khf1:matrix_min(Mx::[[value()]], F::fmin()) -> {MinMx::integer(), FMinElems::[triple()]}.
%% ahol Mx egy tetszőleges mátrix;
%% F egy kétargumentumú függvény;
%% MinMx egy számérték, az F függvény által a mátrix elemein felvett minimális érték;
%% FMinElems az F-minimális mátrixelemeket jellemző hármasok listája, a mátrix
%% sorfolytonos ábrázolásának megfelelő sorrendben.
A programot tartalmazó modul két attribútuma ez legyen:
-module(khf1). -export([matrix_min/2]).
Írjon Prolog-eljárást matrix_min/4
néven, amelynek bemenete
egy listák listájaként megadott mátrix és egy F
függvény. Az
eljárás állítsa elő egyrészt a függvény által a mátrix elemein felvett
minimális értéket, másrészt az F
-minimális elemeket jellemző
hármasok listáját!
% :- type xcoord == int.
% :- type ycoord == int.
% :- type value == any.
% :- type triple ---> t(xcoord,ycoord,value).
% :- pred matrix_min(list(list(any))::in, atom::in, number::out, list(triple)::out).
% matrix_min(Mx, F, MinMx, FMinElems), ahol
% Mx egy tetszőleges mátrix;
% F egy függvényt megvalósító kétargumentumú eljárás neve;
% MinMx egy számérték, az F függvény által a mátrix elemein felvett
% minimális érték;
% FMinElems az F-minimális mátrixelemeket jellemző hármasok listája, a
% mátrix sorfolytonos ábrázolásának megfelelő sorrendben.
A megírandó eljárás a függvény-argumentumot egy F
atom
formájában kapja meg, amely egy kétargumentumú eljárás neve. Az
F/2
eljárás meghívásakor az Mx
mátrix egy
tetszőleges elemét adhatjuk meg első argumentumként, másodikként pedig egy
változót. Az F/2
eljárás ez esetben sikeresen lefut, és a
második argumentumban visszadja az adott elemhez rendelt függvényértéket.
Egy F
nevű, kétargumentumú eljárás A1
és
A2
argumentumokkal való meghívására az alább definiált eljárás
használható:
call2(F, A1, A2) :- Goal =.. [F,A1,A2], call(Goal).Példák a
call2/3
eljárás használatára:
| ?- call2(length, [a,b,c], Len). Len = 3 ? ; no | ?- call2(atom_length, abrakadabra, Len). Len = 11 ? ; no
Egyes Prolog rendszerekben a fenti funkcionalitás beépített eljárás
formájában is rendelkezésre áll (általában call/3
néven). Mivel a SICStus Prolog jelen kurzus során használt 3.12 változatában
nem ez a helyzet, kérjük, hogy a a fenti call2/3
eljárásdefiniciót írja be a beadandó programjába.
| ?- matrix_min([[abba,baba,aba,c],[a,ba,b,bab]], atom_length, Min, L). L = [t(4,1,c),t(1,2,a),t(3,2,b)], Min = 1 ? ; no
| ?- [user]. % consulting user... | neg(X, Y) :- Y is -X. | % consulted user in module user, 10 msec 224 bytes yes | ?- matrix_min([[1,3,12],[12, 9, 10]], neg, Min, L). L = [t(3,1,12),t(1,2,12)], Min = -12 ? ; no
| ?- matrix_min([[[3,1],[1,2]],[[9], [10]]], length, Min, L). L = [t(1,2,[9]),t(2,2,[10])], Min = 1 ? ; no
2> khf1:matrix_min([[abba,baba,aba,c],[a,ba,b,bab]], fun(A) -> length(atom_to_list(A)) end). {1,[{4,1,c},{1,2,a},{3,2,b}]}
3> khf1:matrix_min([[1,3,12],[12, 9, 10]], fun(X) -> -X end). {-12,[{3,1,12},{1,2,12}]}
4> khf1:matrix_min([[[3,1],[1,2]],[[9], [10]]], fun erlang:length/1). {1,[{1,2,"\t"},{2,2,"\n"}]}
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.