2. nagy házi feladat (Prolog): Számtekercs

Kiadás: 2024-10-15, beadási határidő a honlapon.
Verzió: $LastChangedDate: 2024-11-23 21:03:02 +0100 (Sat, 23 Nov 2024) $

A számtekercs feladvány

Az 2. nagy házi feladat

A második nagy házi feladat a tekercs/2 predikátum (eljárás) megírása Prologban. A formális specifikációt lejjebb találja.

Az eljárás első, bemenő paramétere a feladványt írja le, a második, kimenő paraméter a feladvány egy megoldása. 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 második, kimenő paraméterben kell előállítani a kitöltött táblát, egész számokból álló listák listájaként. Minden egyes szám a tábla egy-egy mezőjének az értéket adja meg: ha a szám 0, akkor a mező üres, egyébként pedig egy i egész szám, ahol 1 =< i =< m.

Az 1. ábrán bemutatott feladvány esetén például a tekercs/2 predikátum első (bemenő) paramétere ez kell legyen:

     szt(6,3,[i(1,5,2),i(2,2,1),i(4,6,1)])

Az eljárás feladata, hogy (visszalépések során) állítsa elő a feladvány összes megoldását. A 2. ábrán látható (egyetlen) megoldást írja le az alábbi, listák listájaként ábrázolt mátrix:

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

Prolog-specifikációk

A szamtekercs/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 feladvany_leiro ---> szt(meret, ciklus, list(adott_elem)).
% :- type meret             == integer.
% :- type ciklus            == integer.
% :- type adott_elem      ---> i(sorszam, oszlopszam, ertek).
% :- type sorszam           == integer.
% :- type oszlopszam        == integer.
% :- type ertek             == integer.
		          
% :- type megoldas          == list(sor).
% :- type sor               == list(ertek).
% :- type ertek             == integer.

% :- pred szamtekercs(feladvany_leiro::in, megoldas::out).
A szamtekercs/2 eljárás első, feladvany_leiro típusú paramétere mindenképpen kielégíti az alábbi feltételt:
helyes_feladvany_leiro(szt(Meret,Ciklus,Adottak)) :-
	integer(Meret), integer(Ciklus),
	Meret >= 1, Ciklus >= 1,
	Ciklus =< Meret,
        % nincs nem helyes eleme az Adottak listának:
	\+ (   member(Adott, Adottak), 
	       \+ helyes_adott_elem(Meret, Ciklus, Adott)
	   ),  
	% az Adottak lista lexikografikusan rendezett:
	sort(Adottak, Adottak),
	% Az Adottak lista minden eleme különböző (Sor,Oszlop) 
	% koordinátára vonatkozik (a rendezettség miatt elegendő a
        % szomszédos elemekre kikötni ezt):
	\+ append(_, [i(S,O,_),i(S,O,_)|_], Adottak).

helyes_adott_elem(Meret, Ciklus, i(Sor,Oszlop,Ertek)) :-
	integer(Sor), integer(Oszlop), integer(Ertek),
	1 =< Sor, Sor =< Meret,
	1 =< Oszlop, Oszlop =< Meret,
	0 =< Ertek, Ertek =< Ciklus.
A Prolog megoldásában tehát feltételezheti, hogy a bemenő argumentumra a helyes_feladvany_leiro/1 eljárás sikeresen lefut (csak ilyen adattal teszteljük majd a programot).

Példa

Az alábbi Prolog hívás az 1. ábrán látható feladványt oldja meg, az Mx változóban sorolva fel a megoldásokat. Mivel a feladványnak csak egy megoldása van, az alábbi tekercs/2 hívás csak egy sikeres választ ad, amely a 2. ábrán látható megoldásnak felel meg:

  | ?- tekercs(szt(6,3,[i(1,5,2),i(2,2,1),i(4,6,1)]), Mx).
  Mx = [[1,0,0,0,2,3],
        [0,1,2,3,0,0],
        [0,3,1,2,0,0],
        [0,2,3,0,0,1],
        [3,0,0,0,1,2],
        [2,0,0,1,3,0]] ? ;
  no

Egyéb követelmények

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.

A beadott programokat Linux környezetben SICStus Prolog 4 rendszerrel teszteljük.

Segédanyagok

Dokumentációs követelmények

Egyéb tudnivalók

DP Admin: dvacakrobotjaitoknakp@iit.bme.hu Vissza az elejére / Back to the top