:- use_module(library(lists)). % Deklaratív programozás % % 4. Prolog gyakorlat % % 2024 november 5. % % % % % Prolog programozás % % --------------------------------------------------------------------------- % % % 1. Számtani sorozat ellenõrzése % % % szamtani_sorozat1(+L, ?X0, ?D, ?N): Az L lista egy X0 egésszel % % kezdődő, D egész különbségű, N hosszúságú egész számokból álló % % számtani sorozat. Kikötjük, hogy L legalább 2-elemű tömör % % (azaz behelyettesítetlen változót nem tartalmazó) egészlista % % kell legyen. % | ?- szamtani_sorozat1([1,4,7,10], X0, D, N). % X0 = 1, D = 3, N = 4 ? ; no % | ?- szamtani_sorozat1([1,3,7,10], X0, D, N). % no szamtani_sorozat1(L, X0, D, N) :- length(L, N), L = [X0|L1], szamtani_sorozat1(L1, X0, D). szamtani_sorozat1([], _X0, _D). szamtani_sorozat1([X1|L], X0, D) :- D is X1 - X0, szamtani_sorozat1(L, X1, D). % 2. Számtani sorozat generálása % % szamtani_sorozat1(?L, +X0, +D, +N): Az L lista egy X0-lal % % kezdődő, D különbségű, N >= 2 hosszúságú számtani sorozat. % % D, X0 és N adott egész számok. % | ?- szamtani_sorozat2(L, 11, 3, 4). % L = [11,14,17,20] ? ; no % | ?- szamtani_sorozat2([1,3], 1, 1, 2). % no % | ?- szamtani_sorozat2(L, 1, 1, 2). % L = [1,2] ? ; no szamtani_sorozat2(L, X0, D, N) :- length(L, N), L = [X0|L1], szamtani_sorozat2(L1, X0, D). szamtani_sorozat2([], _X0, _D). szamtani_sorozat2([X1|L], X0, D) :- X1 is X0+D, szamtani_sorozat2(L, X1, D). % 3. Számtani sorozat ellenõrzése vagy generálása % % Ez a változat képes megoldani mind az 1. mind a 2. feladatban % % specifikált eseteket. % % szamtani_sorozat3(?L, ?X0, ?D, ?N): Az L lista egy X0-lal % % kezdődő, D különbségű, N >= 2 hosszúságú számtani sorozat. % % Vagy L tömör egészlista, vagy X0, D, N mindegyike adott % % egész. szamtani_sorozat3(L, X0, D, N) :- ( var(X0) -> szamtani_sorozat1(L, X0, D, N) ; szamtani_sorozat2(L, X0, D, N) ). % | ?- szamtani_sorozat3(L, 11, 3, 4). % L = [11,14,17,20] ? ; % no % | ?- szamtani_sorozat3([11,14,17,20], X0, D, N). % X0 = 11, D = 3, N = 4 ? ; no % 4. Számtani sorozat kiegészítése % % szamtani_sorozat4(?L, ?D, ?N): Az L lista egy D különbségű % % N >= 2 hosszúságú egész számokból álló számtani sorozat. % % L hossza ismert, vagy N adott egész. % % L legalább 1 eleme adott egész. % % L legalább 2 eleme adott egész vagy D adott egész. % % Ügyeljen arra, hogy az eljárás ne adjon többszörös megoldást. % | ?- L = [_,14,_,20,_,_], szamtani_sorozat4(L, D, N). % L = [11,14,17,20,23,26], D = 3, N = 6 ? ; no % | ?- L = [_,_,20,_,_], szamtani_sorozat4(L, 3, N). % L = [14,17,20,23,26], N = 5 ? ; no % | ?- L = [_,_,20,23|_], szamtani_sorozat4(L, D, 10). % L = [14,17,20,23,26,29,32,35,38,41], D = 3 ? ; no % | ?- L = [_,_,20,_,23|_], szamtani_sorozat4(L, D, 10). % no szamtani_sorozat4(L, D, N) :- length(L, N), nth0(I, L, XI), integer(XI), !, ( integer(D) -> X0 is XI - I*D ; nth0(J, L, XJ), J>I, integer(XJ) -> D0 is (XJ-XI)/(J-I), D is integer(D0), D =:= D0 -> X0 is XI - I*D ), L = [X0|L1], szamtani_sorozat2(L1, X0, D). % % "Egyklózos-programozás" jellegű feladatok % ======================================== % % Az alábbi feladatok megoldásaként egyetlen *nem rekurzív* klózból álló predikátumot kell leírni. % Ha a felsorolás sorrendjét a feladatban nem említjük, akkor ez a sorrend tetszőleges lehet. % % Az alábbi beépített ill. könyvtári eljárások használhatók: % % append/3, append/2, member/2, memberchk/2, select/3, reverse/2, nth0/3, nth1/3, sumlist/2, % last/2, sort/2, length/2, between/3, findall/3, bagof/3, setof/3, = /2, \= /2, és az % aritmetikai beépített eljárások, valamint a Prolog vezérlési szerkezetei (diszjunkció, % negáció, feltételes kifejezés). Törekedjék minél tömörebb megoldásra! % % 5. Adott bemeneti számlista esetén balról jobbra haladva sorolja fel a lista % szélsőértékeit, azaz azokat az elemeket, amelyeknek mindkét oldalán van % szomszédja, és amelyek vagy mindkét közvetlen szomszédnál határozottan nagyobbak, % vagy mindkettőnél határozottan kisebbek! % % % f5(L, X): X az L lista szélsőértéke. A megoldásokat balról jobbra sorolja fel! % % | ?- f5([1,9,2,8,3,7,12], X). % X = 9 ? ; % X = 2 ? ; % X = 8 ? ; % X = 3 ? ; % no f5(L, X) :- append(_, [A,X,B|_], L), ( X > max(A,B) -> true % "-> true" nélkül is elfogadható ; X < min(A,B) ). % 6. Adott bemeneti számlista esetén sorolja fel az összes olyan A-B párt, amelyre A % és B az adott listában közvetlenül szomszédos elemekként (ebben a sorrendben) % előfordulnak és amelyre az A+B összeg értéke 5! % % % f6(L, A-B): A és B két olyan szomszédos eleme az L számlistának, amelyek % % összege 5. % % | ?- f6([1,2,3,2,4], X). % X = 2-3 ? ; % X = 3-2 ? ; % no f6(L, A-B) :- append(_, [A,B|_], L), A+B =:= 5. % 7. Adott bemeneti számlista esetén sorolja fel az összes olyan h(A,S,B) struktúra- % kifejezést, amelyre A, S és B a bemeneti listában (nem feltétlenül szomszédos) % elemekként ebben a sorrendben előfordulnak és amelyre az A+B összeg értéke S! % % % f7(L, h(A,S,B)): Az A, S, B számok ebben a sorrendben (de nem % % feltétlenül szomszédosan) előfordulnak az L listában, és A+B=S. % % | ?- f7([1,5,4,7,3,7,-1], X). % X = h(1,5,4) ? ; % X = h(1,4,3) ? ; % X = h(5,4,-1) ? ; % X = h(4,7,3) ? ; % X = h(4,3,-1) ? ; % no f7(L, h(A,S,B)) :- append([_,[A|_],[S|_],[B|_]], L), A+B =:= S. % 8. Adott L bemeneti egészlista esetén állitsa elő a listában előforduló % páros számok összegét! % % % f8(L, S): S az L egészlista páros elemeinek összege. % | ?- f8([1,9,2,8,3,7,12], S). % S = 22 ? ; % no % f8(L, S) :- findall(P, ( member(P, L), P mod 2 =:= 0 ), PL), sumlist(PL, S). % 9. Egy számlistában szorzatelemnek hívunk egy elemet, ha az őt % megelőző elemet megszorozva az utána következő elemmel őt magát % kapjuk meg. % % Írjon olyan Prolog eljárást szorzatelem néven, amely % balról jobbra haladva felsorolja egy számlistában levő % szorzatelemeket! % % | ?- f9([1,2,3,1], T). % no % | ?- f9([1,2,2,1,4,8,2], T). % T = 2 ? ; % T = 2 ? ; % T = 8 ? ; % no % | ?- f9([-2,6,-3,-0.5], T). % T = 6 ? ; % T = -3 ? ; % no f9(L, B) :- append(_, [A,B,C|_], L), A*C =:= B.