BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak
Nappali tagozat
2006/2007. tanév, őszi félév

Deklaratív programozás

3. Prolog kis házi feladat

V1.2, 2006. december 15.

A feladat

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:

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.

Otthoni tesztkörnyezet

A fejlesztés közbeni tesztelésre a SICStus Prolog vagy az SWI-Prolog ajánlott. Hasznos lehet még az alábbi segédprogram (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.

Tudnivalók a beadásról

A kis házi feladat beadását, jóllehet nem kötelező, a tárgy minden hallgatójának nagyon ajánljuk.

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.