% Deklaratív programozás % % 1. Prolog gyakorlat % % 2024 október 15. % % % % % Prolog programozás % % --------------------------------------------------------------------------- % P1. Egészlista minden elemének növelése % lista_noveltje(*L0, -L): Az L egészlista úgy áll elő az L0 % egészlistából, hogy az utóbbi minden egyes elemét 1-gyel megnöveljük. lista_noveltje([], []). lista_noveltje([X|L], [X1|L1]) :- X1 is X+1, lista_noveltje(L, L1). % P2. Egy lista utolsó elemének meghatározása % lista_utolso_eleme(*L, ?Ertek): Az L egészlista utolsó eleme Ertek. lista_utolso_eleme([X], X). lista_utolso_eleme([_|L], U) :- lista_utolso_eleme(L, U). % P3. Számsorozat generálása % seq(+N, +M, -L): Az L lista M-N+1 hosszú, elemei 1 különbségű % számtani sorozatot alkotnak, és L első eleme (ha van) N, ahol N % és M egész számok. % seq(+N, +M, -L): Az L lista M-N+1 hosszú, elemei 1 különbségű számtani % sorozatot alkotnak, és L első eleme (ha van) N, ahol N és M egész számok. seq(N, M, []) :- M =:= N - 1. seq(N, M, [N|Seq]) :- M >= N, N1 is N+1, seq(N1, M, Seq). % P4. Számintervallum felsorolása % max(+N, ?X): X egy egész szám, melyre 0 < X =< N, ahol % N egy adott egész szám. max(N, N) :- N > 0. max(N, X) :- N > 1, N1 is N-1, max(N1, X). % P5. Egy lista adott n-edik elemének meghatározása % (A listaelemeket 1-től kezdve számozzuk -- ez a további % feladatokra is érvényes, ha nem mondunk mást.) % ennedik(+N, *L, -E): E az L lista N-edik eleme. ennedik(1, [X|_], X). ennedik(N, [_|L], E) :- N > 1, N1 is N-1, ennedik(N1, L, E). % P6. Lista adott hosszúságú prefixuma % prefixum(*L0, Hossz, -L): L az L0 egészlista Hossz hosszúságú % prefixuma. prefixum([X|L], Hossz, [X|P]) :- Hossz1 is Hossz-1, Hossz1 >= 0, prefixum(L, Hossz1, P). prefixum(_, 0, []). % P7. Lista adott helyen kezdődő szuffixuma % lista_szuffixuma(*Lista, +Elozok, -Szuffixum): A Lista lista azon % szuffixuma a Szuffixum lista, amelyet Elozok számú listaelem előz % meg. szuffixum(Lista, 0, Lista). szuffixum([_X|Lista], Elozok, Szuffixum) :- Elozok1 is Elozok-1, Elozok1 >= 0, szuffixum(Lista, Elozok1, Szuffixum). % P8. Egy lista adott n-edik elemének a cseréje % ennedik_csere(+N, *L0, -E0, -L, +E): E0 az L0 lista N-edik eleme. L az % L0-ból úgy áll elő, hogy L0-nak az N-edik elemét E-re cseréljük. ennedik_csere(1, [E0|L0], E0, [E|L0], E). ennedik_csere(N, [X|L0], E0, [X|L], E) :- N > 1, N1 is N-1, ennedik_csere(N1, L0, E0, L, E). % P9. Egy lista összes prefixumának felsorolása % prefixumát. A felsorolás sorrendjére nem teszünk megkötést. % prefixuma(*L0, -L): L az L0 egészlista prefixuma. prefixum([X|L], [X|P]) :- prefixum(L, P). prefixum(_, []). % P10. Részlista képzése % reszlista(*Lista, ?Resz, +Elotte, +Hossz): A Lista lista azon % (folytonos) részlistája Resz, amely előtt Elotte számú elem áll % és amelynek hossza Hossz. reszlista(Lista0, Resz, Elotte, Hossz) :- szuffixum(Lista0, Elotte, Lista1), prefixum(Lista1, Hossz, Resz). % P11. Egy lista elemeinek és és a hozzájuk tartozó indexeknek a % felsorolása. A felsorolás sorrendjére nem teszünk megkötést. % Segédeljárás használata nélkül: % ennedik_f_0(-N, *L, -E): E az L lista N-edik eleme. ennedik_f_0(1, [X|_], X). ennedik_f_0(N, [_|L], E) :- ennedik_f_0(N1, L, E), N is N1+1. % Segédeljárással jobbrekurzívvá tehető: ennedik_f(N, L, E) :- ennedik_f(N, 1, L, E). ennedik_f(I, I, [E|_], E). ennedik_f(N, I, [_|L], E) :- I1 is I+1, ennedik_f(N, I1, L, E). % P12. Egy lista n-edik elemének a cseréje, ahol n nem feltétlenül % adott. A felsorolás sorrendjére nem teszünk megkötést. % ennedik_csere_f(?N, *L0, ?E0, ?L, ?E): E0 az L0 lista N-edik eleme. % L az L0-ból úgy áll elő, hogy L0-nak az N-edik elemét E-re cseréljük. % Segédeljárás használata nélkül: ennedik_csere_f_0(1, [E0|L0], E0, [E|L0], E). ennedik_csere_f_0(N, [X|L0], E0, [X|L], E) :- ennedik_csere_f_0(N1, L0, E0, L, E), N is N1+1. % Segédeljárással jobbrekurzívvá tehető: ennedik_csere_f(N, L0, E0, L, E) :- ennedik_csere_f(N, 1, L0, E0, L, E). ennedik_csere_f(I, I, [E0|L], E0, [E|L], E). ennedik_csere_f(N, I, [X|L0], E0, [X|L], E) :- I1 is I+1, ennedik_csere_f(N, I1, L0, E0, L, E). % P13. Részlisták felsorolása % reszlista_f(*Lista, ?Resz, ?Elotte, ?Hossz): A Lista lista azon % (folytonos) részlistája Resz, amely előtt Elotte számú elem áll % és amelynek hossza Hossz. Resz üres lista is lehet. % A felsorolás sorrendjére nem teszünk megkötést. % Itt kivételesen megengedjük az append eljárás használatát. reszlista_f(Lista, Resz, Elotte, Hossz) :- append(ElotteL, ReszPluszFarok, Lista), append(Resz, _, ReszPluszFarok), length(Resz, Hossz), length(ElotteL, Elotte).