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 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 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, 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 "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! Az aritmetikai eljárásokban (is, =:=, < stb.) használhatja a min(_,_) és max(_,_) függvényeket. % 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 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 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 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 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