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]]
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).
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
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.
| DP Admin: dvacakrobotjaitoknakp@iit.bme.hu | Vissza az elejére / Back to the top |