BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2006/2007. tanév, őszi félév
|
Egy tömör listát kulcs-érték listának nevezünk, ha minden eleme
K-V
alakú kulcs-érték pár. (Tömörnek nevezzük az
adatstruktúrát, ha nincs benne behelyettesítetlen változó.)
Írjon olyan Prolog programot, amely fölsorolja egy kulcs-érték lista
összes olyan lehető leghosszabb (azaz egyik irányban sem kiterjeszthető),
legalább kételemű [K1-V1, ...,
Kn-Vn]
folytonos részlistáit, amelyekre a
következő feltételek teljesülnek:
Ki<Kj
, ha i<j
(vagyis a kulcsok növekvő sorrendben vannak rendezve) ésVi
értékek számtani sorozatot alkotnak.A program tartalmazza a seq/2
eljárást a következő
jelentéssel:
% :- type intpair --> int-int. % :- pred seq(list(intpair)::in, list(intpair)) % seq(+L,?S), ahol az S az L kulcs-érték listának egy olyan % lehető leghosszabb, legalább kételemű részlistája, amelyben a % kulcsok növekvő sorrendűek, az értékek pedig számtani sorozatot % alkotnak. Előfeltétel: L tömör, a kulcsok és az értékek egész számok.
Az alábbi példaprogram egy kulcs-érték lista kételemű, a feltételeknek megfelelő részlistáit sorolja föl (a ki-nem-terjeszthetőségtől eltekintve):
seq([K1-V1,K2-V2|_],[K1-V1,K2-V2]):- K1<K2. seq([_|L],S):- seq(L, S).
A jobbrekurzív eljárások kevesebb memóriát igényelnek, mint az egyéb rekurzív eljárások, ezért a feladat megoldása során jobbrekurzív eljárások írása ajánlott, ám ez nem kötelező, a pontozásba nem számít bele.
seqtest.pl
):
:- consult('seq'). :- \+ seq([],S). :- \+ seq([1-3],S). :- \+ seq([1-3,1-3],S). :- findall(S,seq([1-3,2-5],S), L), L == [[1-3,2-5]]. :- findall(S,seq([1-3,2-5,4-7],S), L), L == [[1-3,2-5,4-7]]. :- findall(S,seq([1-3,2-5,4-9],S), L), L == [[1-3,2-5],[2-5,4-9]]. :- findall(S,seq([1-3,2-5,4-7,2-7],S), L), L == [[1-3,2-5,4-7]]. :- findall(S,seq([1-3,2-5,4-7,2-7,4-9],S), L), L == [[1-3,2-5,4-7],[2-7,4-9]]. :- findall(S,seq([1-3,2-5,4-7,2-7,4-9,7-9],S), L), L == [[1-3,2-5,4-7],[2-7,4-9],[4-9,7-9]]. :- findall(S,seq([1-3,2-5,4-7,2-7,4-9,7-9,8-9,5-7,6-8,7-9],S), L), L == [[1-3,2-5,4-7],[2-7,4-9],[4-9,7-9,8-9],[5-7,6-8,7-9]]. :- findall(S,seq([1-7,2-5,4-3,2-7,4-9,7-9,8-9,8-9,5-9,6-7,7-5],S), L), L == [[1-7,2-5,4-3],[2-7,4-9],[4-9,7-9,8-9],[5-9,6-7,7-5]].
Ha ezt a programot a környezet hiba nélkül betölti (pl. a sicstus
-l seqtest.pl
vagy az swipl -s seqtest.pl
parancs
hatására), akkor a seq.pl
-ben nincs szintaktikai hiba, és a
seqtest.pl
-ben leírt tesztesetek is hibátlanul futottak le.
A programot az Elektronikus Tanársegéd segítségével weben keresztül lehet beadni, a HF beadás menüpont alatt. A beadási határidő 2007. január 3. szerda 24:00, 2006. dec. 22-én vizsgázóknak dec. 21., csütörtök 24:00.
A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatért plusz 1 pont jár.