--------------------------------------------------------------------------- 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) és rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [B-A,w-B*C,A|D] [U,U,_*s] Megoldás: .(-(B,A),.(-(w,*(B,C)),.(A,D))) .(U,.(U,.(*(_,s),[]))) . . / \ / \ / \ / \ / \ U . - \ / \ / \ \ / \ / \ \ U . / \ \ / \ B A . / \ / \ * [] / \ / \ / . / \ / / \ _ s - A D / \ w * / \ B C egyesíthetőek, a következő behelyettesítéssel: A = w*s, B = w, C = s, D = [], U = w-w*s 2. Írjon olyan Prolog eljárást, amely adott N>=0-ra felépíti azt a 2N hosszúságú listát, amelynek első N eleme az 'a', hátsó N eleme pedig a 'b' atom! Törekedjék hatékony, jobbrekurzív megoldásra! % anbn(N, L): L = [a, ..., a, b, ..., b] % N db N db % :- pred anbn(int::in, list(atom)::out). Példa: | ?- anbn(2, L). L = [a,a,b,b] Megoldások: a. Nem hatekony megoldas (mert append-et hasznal) anbn1(N, L) :- an(a, N, AN), an(b, N, BN), append(AN, BN, L). % an(A, N, L): L az A elemet N-szer tartalmazó lista an(_A, 0, []). an(A, N, [A|L]) :- N > 0, N1 is N-1, an(A, N1, L). b. Hatékony, jobbrekurzív megoldás: anbn2(N, L) :- an(b, N, [], BN), an(a, N, BN, L). % an(A, N, L0, L): L az A elemet N-szer tartalmazó lista L0 elé fűzése. an(_A, 0, L0, L0). an(A, N, L0, L) :- N > 0, N1 is N-1, an(A, N1, [A|L0], L). c. optimális megoldás: anbn3(N, L) :- anbn3(N, [], L). % anbn3(N, L0, L): L = [a, ..., a, b, ..., b, L0] % N db N db anbn3(0, L, L) :- !. anbn3(N, L0, [a|L]) :- N > 0, N1 is N-1, anbn3(N1, [b|L0], L). 3. Egy listában maximális platónak hívunk egy olyan legalább kételemű részlistát, amely csupa azonos elemből áll, és egyik irányba sem terjeszthető ki ezzel az elemmel. Írjon olyan Prolog eljárást, amely felsorolja atomok egy adott listájában található maximális platók hosszát, és az ismétlődő elemet. % plato(L, H, A): Az L listában található egy H hosszúságú, % A atomokból képzett maximális plató. % :- pred plato(list(atom)::in, int::out, atom::out). Példa: | ?- plato([a,b,b,b,b,a,a,c,b,b], H, A). A = b, H = 4 ? ; A = a, H = 2 ? ; A = b, H = 2 ? ; no Megoldások: a. plato1(L, N, A) :- append(L0, L1, L), % L = L0 app L1 append([A,A|Ak], L2, L1), % L = L0 app [A,A|Ak] app L2 nemutolso(L0, A), azonos(Ak, A, 2, N), nemelso(L2, A). % nemutolso(L, A): nem igaz, hogy L listanak utolso eleme A nemutolso([], _). nemutolso([NA], A) :- NA \== A. nemutolso([_X,Y|L], NU) :- nemutolso([Y|L], NU). % nemelso(L, A): nem igaz, hogy L listanak elso eleme A nemelso([], _). nemelso([A|_L], NA) :- NA \== A. % azonos(L, A, N0, N): Az L lista k db A-bol all, es N=N0+k. azonos([], _A, N, N). azonos([A|L], A, N0, N) :- N1 is N0+1, azonos(L, A, N1, N). b. hatekonyabb megoldas: plato2(L, N, A) :- plato2(L, 0, N, A). % kihasznaljuk, hogy L atomokbol all, % 0 nem fordulhat elo koztuk. % plato2(L, NA, N, A): Az L listában található egy N hosszúságú, % A atomokból képzett maximális plató. Ha a plató a lista elején áll % akkor A nem egyenlo NA-val. plato2([A,A|L], NA, N, A) :- A \== NA, append(Ak, L1, L), azonos(Ak, A, 2, N), nemelso(L1, A). plato2([NA|L], _, N, A) :- plato2(L, NA, N, A). c. meg hatekonyabb megoldas: plato3(L, N, A) :- plato3(L, 0, N, A). % plato3(L, NA, N, A): Az L listában található egy N hosszúságú, % A atomokból képzett maximális plató. Ha a plató a lista elején áll % akkor A nem egyenlo NA-val. plato3([A,A|L], NA, N, A) :- A \== NA, azonos(L, L1, A, 2, N), nemelso(L1, A). plato3([NA|L], _, N, A) :- plato3(L, NA, N, A). % azonos(L0, L, A, N0, N): Az L0 lista elejerol leszedheto k db A es % marad L, tovabba N=N0+k. azonos([A|L0], L, A, N0, N) :- N1 is N0+1, azonos(L0, L, A, N1, N). azonos(L, L, _A, N, N). d. meg meg hatekonyabb megoldas: plato4(L, N, A) :- plato4(L, 0, N, A). % plato4(L, NA, N, A): Az L listában található egy N hosszúságú, % A atomokból képzett maximális plató. Ha a plató a lista elején áll % akkor A nem egyenlo NA-val. plato4([A,A|L], NA, NN, AA) :- A \== NA, !, maxazonos(L, L1, A, 2, N), ( NN = N, AA = A ; plato4(L1, NN, AA) ). plato4([NA|L], _, N, A) :- plato4(L, NA, N, A). % maxazonos(L0, L, A, N0, N): Az L0 lista elejerol leszedheto k db A es % marad egy nem A-val kezdodo L, tovabba N=N0+k. maxazonos([A|L0], L, A, N0, N) :- !, N1 is N0+1, maxazonos(L0, L, A, N1, N). maxazonos(L, L, _A, N, N). --------------------------------------------------------------------------- 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) és rajzolja fel a hozzájuk tartozó fastruktúrákat. Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel. f(X/Y, [3/X-a|Z], Z) f(A, [A-B,b,B], [C|D]) 2. Írjon Prolog programot, amely előállítja egy pozitív egész szám adott alapú számrendszerben vett jegyeinek listáját: % szam(Szam, Alap, Jegyek): A Szam szám Alap alapú számrendszerben vett % jegyeinek listája Jegyek. % :- pred szam(int::in, int::in, list(int)::out). Példák: | ?- szam(45, 10, JL). JL = [4,5] | ?- szam(45, 2, JL). JL = [1,0,1,1,0,1] | ?- szam(45, 16, JL). JL = [2,13] 3. Írjon Prolog programot amely felsorolja egy adott lista ismétlődő részlistáit és ezek kezdőpozicióit. Egy részlista ismétlődő, ha közvetlenül egymás után (legalább) kétszer szerepel. Kezdőpozición az első ismétlődés első elemének sorszámát értjük, 1-től számozva. % dadogo(Lista, Dadog, Poz): A Lista listában a Poz pozición egy % ismétlődő Dadog részlista áll. % :- pred dadogo(list(T)::in, list(T)::out, int:out). Példa: | ?- dadogo([a,m,a,m,m,a,m,i,a], D, P). D = [a,m], P = 1 ? ; D = [m,a,m], P = 2 ? ; D = [m], P = 4 ? ; no --------------------------------------------------------------------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használtható. A 2. és 3. feladatokban nem használhat saját maga által definiált segédeljárást, a 4. feladatban pedig csak az ott leírt segédeljárást használhatja. 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) és rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! a. [-(1,A),A|D] [X-U*V,1*2,3] b. [.(1,A),B,B,A] [[X],U*V,1*2,Z] 2. Írjon olyan Prolog eljárást, amely adott N>=0, X0 és D esetén felépíti azt az N hosszúságú listát, amelynek elemei X0 kezdőértékű és D különbségű számtani sorozatot alkotnak! % szamsor(N, X0, D, L): Az L lista N>0 elemű számtani sorozat, amelynek % első eleme X0, különbsége D. % :- pred szamsor(int::in, int::in, int::in, list(int)::out). Példa: | ?- szamsor(4, 10, 5, L). L = [10,15,20,25] 3. Írjon olyan Prolog eljárást, amely egy adott atomnak felsorolja az összes olyan legalább kétbetűs rész-atomját, amely `a' betűre végződik! % avegu(Atom, Resz): Az Atom atomnak Resz olyan rész-atomja, amely `a' % betűre végződik és legalább két karakterből áll. % :- pred avegu(atom::in, atom::out). Példa: | ?- avegu(baka, R). R = ba; R = baka; R = aka; R = ka; no 4. Írjon olyan Prolog eljárást, amely egy adott számlista összes legalább kételemű szigorúan monoton fogyó rész-listáját felsorolja. A rész-lista minden elemének szerepelnie kell az eredeti listában, az adott sorrendben, de nem feltétlenül folyamatosan. % fogyo_resze(L, R): Az R lista az L számlista olyan legalább kételemű % (nem feltétlenül folyamatos) rész-listája, amely szigorúan monoton % fogyó. % :- pred fogyo_resze(list(int)::in, list(int)::out). Példa: | ?- fogyo_resze([5,2,4,3], R). R = [5,2]; R = [5,4,3]; R = [5,4]; R = [5,3]; R = [4,3]; no A feladat megoldásában csak a következő fejkommenttel meghatározott segédeljárást használhatja. Természetesen ezt a segédeljárást is meg kell írnia. % fogyo_resze(L, X, R): Az R lista az L számlista olyan rész-listája, % amely szigorúan monoton fogyó és első eleme kisebb X-nél. % :- pred fogyo_resze(list(int)::in, int::in, list(int)::out). --------------------------------------------------------------------------- Prolog feladatok ---------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használható. Ha segédeljárást definiál, feltétlenül adjon meg hozzá fejkommentet; enélkül a megoldás nem értékelhető, vagy csak csökkentett pontszámot kaphat. Törekedjék egyszerű, tömör és hatékony programozásra; használjon jobbrekurziót, kerülje a felesleges hívásokat (pl. az append eljárás felesleges használatát). 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) vagy rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [X-2*U,X,*(_,3)|V] [A-B,a,B,b] 2. Írjon olyan Prolog eljárást, amely adott Min =< Max, egész számok esetén felépíti a Min és Max közé eső ún. prímjelöltek listáját! Itt prímjelöltnek hívunk minden olyan egész számot, amely nem osztható 2-vel, 3-mal, sem 5-tel. % primjeloltek(Min, Max, L): Az X prímjelöltek (Min =< X =< Max) % növekedő listája L. % :- pred primjeloltek(int::in, int::in, list(int)::out). Példa: | ?- primjeloltek(40, 60, L). L = [41,43,47,49,53,59] ? 3. Írjon olyan Prolog eljárást, amely egy adott atomnak felsorolja az összes olyan legalább kétbetűs rész-atomját, amelynek első és utolsó betűje azonos! Lehetőleg ne definiáljon segédeljárást! % vegazonos(Atom, Resz): Az Atom atomnak Resz olyan rész-atomja, amelynek % első és utolsó karaktere azonos, és legalább két karakterből áll. % :- pred vegazonos(atom::in, atom::out). Példa: | ?- vegazonos(papagaj, R). R = pap; R = apa; R = apaga; R = aga; no 4. Írjon olyan Prolog eljárást, amely egy adott atom-listát átalakít oly módon, hogy `N' darab (N >= 1) egymás után ismétlődő `A' atomot egyetlen `N*A' kifejezéssel helyettesít. % atalakit(L, T): A T lista az L atom-lista átalakított formája, % a fenti értelemben. % :- type atom_sor ---> int * atom. % :- pred tomorit(list(atom)::in, list(atom_sor)::out). Példa: | ?- tomorit([a,a,b,a,c,c,c], T). T = [2*a,1*b,1*a,3*c] --------------------------------------------------------------------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használható. A 2. és 3. feladatokban nem használhat saját maga által definiált segédeljárást, a 4. feladatban pedig csak az ott leírt segédeljárást használhatja. 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) vagy rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [-(1,A),A|D] [X-U*V,1*2,3] 2. Írjon olyan Prolog eljárást, amely adott N>=0, X0 és D számok esetén felépíti azt az N hosszúságú listát, amelynek elemei X0 kezdőértékű és D különbségű számtani sorozatot alkotnak! Segédeljárást ne definiáljon! % szamsor(N, X0, D, L): Az L lista N>=0 elemű számtani sorozat, amelynek % első eleme X0, különbsége D. % :- pred szamsor(int::in, int::in, int::in, list(int)::out). Példa: | ?- szamsor(4, 10, 5, L). L = [10,15,20,25] 3. Írjon olyan Prolog eljárást, amely egy adott atomnak felsorolja az összes olyan legalább kétbetűs rész-atomját, amely `a' betűre végződik! Segédeljárást ne definiáljon! % avegu(Atom, Resz): Az Atom atomnak Resz olyan rész-atomja, amely `a' % betűre végződik és legalább két karakterből áll. % :- pred avegu(atom::in, atom::out). Példa: | ?- avegu(baka, R). R = ba; R = baka; R = aka; R = ka; no 4. Írjon olyan Prolog eljárást, amely egy adott számlista összes legalább kételemű szigorúan monoton fogyó rész-listáját felsorolja. A rész-lista minden elemének szerepelnie kell az eredeti listában, az adott sorrendben, de nem feltétlenül folyamatosan. % fogyo_resze(L, R): Az R lista az L számlista olyan legalább kételemű % (nem feltétlenül folyamatos) rész-listája, amely szigorúan monoton % fogyó. % :- pred fogyo_resze(list(int)::in, list(int)::out). Példa: | ?- fogyo_resze([5,2,4,3], R). R = [5,2]; R = [5,4,3]; R = [5,4]; R = [5,3]; R = [4,3]; no A feladat megoldásában csak a következő fejkommenttel meghatározott segédeljárást használhatja. Természetesen ezt a segédeljárást is meg kell írnia. % fogyo_resze(L, X, R): Az R lista az L számlista olyan rész-listája, % amely szigorúan monoton fogyó és első eleme kisebb X-nél. % :- pred fogyo_resze(list(int)::in, int::in, list(int)::out). --------------------------------------------------------------------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használható. A 2. és 3. feladatokban nem használhat saját maga által definiált segédeljárást, a 4. feladatban pedig csak az ott leírt segédeljárást használhatja. 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) vagy rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [.(1,C),B,B|A] =[[X,X],X*V,_*2]. 2. Írjon olyan Prolog eljárást, amely adott Q>1, X0>0 és Max>0 esetén felépíti azt a leghosszabb listát, amelynek elemei mind kisebb-egyenlők Max-nál és X0 kezdőértékű és Q hányadosú mértani sorozatot alkotnak! Segédeljárást ne definiáljon! % mersor(X0, Q, Max, L): Az L lista az a leghosszabb mértani sorozat, % amelynek első eleme X0, hányadosa Q, és minden eleme =< Max. % :- pred mersor(int::in, int::in, int::in, list(int)::out). Példa: | ?- mersor(2, 10, 10000, L). L = [2,20,200,2000] 3. Írjon olyan Prolog eljárást, amely egy adott atomnak felsorolja az összes olyan legalább két karakteres rész-atomját, amelynek első és utolsó karaktere megegyezik. Segédeljárást ne definiáljon! % egyszelu(Atom, Resz): Az Atom atomnak Resz olyan rész-atomja, amelynek % első és utolsó karaktere megegyezik, és legalább két karakterből áll. % :- pred egyszelu(atom::in, atom::out). Példa: | ?- egyszelu(baba, R). R = bab ? ; R = aba ? ; no 4. Írjon olyan Prolog eljárást, amely egy adott, pozitív számokból álló listából kiválaszt egy elemet és egy legalább kételemű rész-listát úgy, hogy a rész-lista összege a kiválasztott elem legyen. A rész-lista minden elemének szerepelnie kell az eredeti listában, az adott sorrendben, de nem feltétlenül folyamatosan. % osszegkent_eloall(L, Ossz, R): Ossz az L pozitív számlista egy eleme, % R az L-nek olyan legalább kételemű (nem feltétlenül folyamatos) % rész-listája, amelynek összege Ossz. % :- pred osszegkent_eloall(list(int)::in, int::out, list(int)::out). Példa: | ?- osszegkent_eloall([1,3,5,2], Ossz, R). R = [1,2], Ossz = 3 ; R = [3,2], Ossz = 5 ; no A feladat megoldásában csak a következő fejkommenttel meghatározott segédeljárást használhatja. Természetesen ezt a segédeljárást is meg kell írnia. % reszosszeg(L, Ossz, R): Az R lista az L pozitív számokból álló % lista olyan rész-listája, amelynek összege Ossz. % :- pred reszosszeg(list(int)::in, int::in, list(int)::out). --------------------------------------------------------------------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használható. A 2. és 3. feladatokban nem használhat saját maga által definiált segédeljárást. 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) vagy rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [A+1*2,_*D,A] [3+X,X|W] 2. Írjon olyan Prolog eljárást, amely két adott egész szám esetén képzi a közéjük eső számok reciprok-értékeinek listáját. Segédeljárást ne definiáljon! % rlista(Min, Max, RL): Az RL lista az 1/I értékekből áll, Min= f(any, fa, fa, fa) ; l. Írjon egy ilyan Prolog eljárást, amely az eredeti fával azonos szerkezetű fát ad, úgy hogy az eredményfa csomópontjaiban egy-egy egész szám van, amely az adott részfa leveleinek (l) számát adja meg. Nevezzük ezt a fát az eredeti fa méretfájának. % meretfa(Fa, MFa): MFa a Fa méretfája. % :- pred meretfa(fa::in, fa::out). Példa: | ?- meretfa(f(a,f(b,l,l,l),l, f(c,l,f(d,l,l,l),l)), MFa). MFa = f(9,f(3,l,l,l),l,f(5,l,f(3,l,l,l),l)) A feladat megoldásában segédeljárásokat definiálhat, de mindegyikhez adjon meg egy pontos fejkommentet. --------------------------------------------------------------------------- A Prolog eljárás megírását kérő feladatokban a jegyzetben szereplő összes Prolog eljárás (akár beépített, akár a jegyzetben definiált) szabadon használható. A 2. és 3. feladatokban nem használhat saját maga által definiált segédeljárást. 1. Írja fel az alábbi két Prolog kifejezés alapstruktúra-alakját (azaz szintaktikus édesítőszerek nélküli formáját) vagy rajzolja fel a hozzájuk tartozó fastruktúrákat! Állapítsa meg, hogy a két kifejezés egyesíthető-e, és ha igen, milyen behelyettesítéssel! [1-A-2,A|B] [X-Y,Y,3,Y] 2. Írjon olyan Prolog eljárást, amely két adott egész szám esetén képzi a közéjük eső számok négyzetei listáját. Segédeljárást ne definiáljon! % nlista(Min, Max, RL): Az RL lista az I*I értékekből áll, Min= f(any, fa, fa, fa) ; l. Írjon egy ilyan Prolog eljárást, amely az eredeti fával azonos szerkezetű fát ad, úgy hogy az eredményfa csomópontjaiban egy-egy egész szám van, amely az adott részfa mélységét adja meg. Egy részfa mélysége a gyökérponttól a legtávolabbi levélig vezető út hossza. Nevezzük ezt a fát az eredeti fa mélységfájának. % melysegfa(Fa, MFa): MFa a Fa mélységfája. % :- pred melysegfa(fa::in, fa::out). Példa: | ?- melysegfa(f(a,f(b,l,l,l),l, f(c,l,f(d,l,l,l),l)), MFa). MFa = f(3,f(1,l,l,l),l,f(2,l,f(1,l,l,l),l)) A feladat megoldásában segédeljárásokat definiálhat, de mindegyikhez adjon meg egy pontos fejkommentet. --------------------------------------------------------------------------- 1. Írjon Prologban az (N alatt a K) értékének kiszámítására szolgáló eljárást: % alatta(+N, +K, ?NaK): NaK = N*(N-1)*...*(N-K+1)/K!, ahol 0= ::= expr(, , ) | name() | const(). lehet +, -, * vagy /, ill. egy Prolog név- ill. számkonstans lehet. Egy értékhozzárendelés = alaku párok listája. A megirandó eljárás specifikációja: % erteke(+Kif, +HR, ?Ert): Kif értéke HR hozzárendelés mellett Ert. Példa: erteke( expr(+,name(a),expr(*,name(b),const(2))), [a=1,b=3], E) valasz: E = 7 --------------------------------------------------------------------------- 1. Írjon Prologban a természetes számok reciprokösszegének kiszámítására szolgáló eljárást: % rec_osszeg(+N, ?R): R = 1/1+1/2+...+1/N, ahol N>=1 egész. Lehetőség szerint jobbrekurzív megoldást adjon. Példa: ?- rec_osszeg(3, R). válasz: R = 1.833333 2. Írjon egy lista-szeletelő eljárást Prologban: % szelete(+L, +N, +M, ?Szelet): Az L lista N és M közötti sorszámú elemeiből % álló lista a Szelet (1<=N<=M<=L hossza, a sorszámozás 1-től kezdődik). Példa: ?- szelete([a,b,c,d,e,f,g], 3, 5, L). válasz: L = [c,d,e] 3. Írjon egy olyan eljárást, amely egy tetszőleges Prolog kifejezésben megszámolja egy adott név előfordulásainak számát (mind a konstansként, mind a struktúranévként való előfordulások számítanak). A kifejezésben változók is előfordulhatnak! % elofordul(+Kif, +Nev, ?N): Kif-ben a Nev név N-szer fordul elő. Példa: ?- elofordul(g(f, f(X), fff), f, N). válasz: N = 2 4. Egy G irányítatlan gráfot élei listájával adunk meg, egy élet a két végpontnak a '-' operátorjellel való ősszekapcsolásával jelölünk (a két végpont sorrendje tetszőleges). A végpontokat Prolog konstansok jelölik. Írjon egy Prolog eljárást a következő kérdés eldöntésére: % eljuthatunk(+P, +Q, +N, +G): A G gráfban van P és Q közötti % legfeljebb N hosszúságú út (N >= 0). Vigyázat: a gráfban kör is lehet! Példa: eljuthatunk(a, d, 2, [a-b,b-c,c-a,c-d]). válasz: sikeres lefutás (igen) --------------------------------------------------------------------------- 1. Írjon egy Prolog eljárást, amely két azonos hosszúságú lista elemenként vett összegét képzi: % listaosszeg(+L1, +L2, ?L3): Az L3 lista az L1 és L2 elemenként vett összege Példa: ?- listaosszeg([1,2,3], [4,5,6], L). válasz: L = [5,7,9]. 2. Írjon egy erdekes(X) Prolog eljárást, amely felsorolja a következő tulajdonsággal bíró X számokat: X tizes számrendszerbeli alakja AB. Ha X-et megszorozzuk azon Y számmal, amelynek tizes számrendszerbeli alakja BA, akkor eredményül egy ACA alakú háromjegyű számot kapunk. 3. Írjon Prologban egy lista maximális elemének meghatározására szolgáló eljárást: % listamax(+L, ?M): Az L nem-üres lista legnagyobb eleme M. Lehetőség szerint jobbrekurzív megoldást adjon. Példa: ?- listamax([3,5,1], M). válasz: M = 5 4. Írjon egy Prolog eljárást, amely egy tetszőleges Prolog névkonstansból kiválasztja a nagybetűket, és az ezekből álló nevet adja vissza. % nagybetui(+Nev, ?Nagy): Nagy a Nev nev nagybetűiből álló név. Példa: ?- nagybetui('ali BabA Lova', X). válasz: X = 'BAL'