Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaGyőző Magyar Megváltozta több, mint 10 éve
1
Logikai programozás
2
ISMÉTLÉS Fibonacci sorozat: a/ fibonacci(1,1). fibonacci(2,1). fibonacci(N,F) :- N > 1, N1 is N - 1, N2 is N - 2, fibonacci(N1, F1), fibonacci(N2, F2), F is F1 + F2.
3
ISMÉTLÉS Fibonacci sorozat: b/ fibonacci(N, I, Elozo, Utolso) :- I =< N, Mostani is Elozo + Utolso, UjI is I + 1, fibonacci(N, UjI, Utolso, Mostani). fibonacci(_,_,_,_).
4
ISMÉTLÉS Fibonacci sorozat: c/ fibonacci(N,Elozo, Utolso) :- N > 0, Mostani is Elozo + Utolso, UjN is N - 1, fibonacci(UjN, Utolso, Mostani). fibonacci(_,_,_). Hogyan írathatjuk ki az első N Fibonacci számot? Hogyan határozhatjuk meg az N-edik Fibonacci számot? Hogyan indíthatjuk?
5
ISMÉTLÉS Fibonacci sorozat: b/ (1. javítás) fibonacci(N,I,Elozo, Utolso) :- I =< N, writef('%w. elem: %w\n',[I,Utolso]), Mostani is Elozo + Utolso, UjI is I + 1, fibonacci(N, UjI, Utolso, Mostani). fibonacci(_,_,_,_). Indítás: fibonacci(N) :- writef('Az első %w Fibonacci szám: \n', [N]), fibonacci(N, 1, 0, 1).
6
ISMÉTLÉS Fibonacci sorozat: b/ (2. javítás) fibonacci(N,I,Elozo, Utolso, F) :- I < N, Mostani is Elozo + Utolso, UjI is I + 1, fibonacci(N, UjI, Utolso, Mostani, F). fibonacci(_,_,_, F, F). Indítás: fibonacci(N,F) :- writef('A(z) %w. Fibonacci szám: \n', [N]), fibonacci(N, 1, 0, 1,F). Miért kell a plusz paraméter?
7
ISMÉTLÉS Akkumulátor (gyűjtőargumentum-pár): Ugyanahhoz a mennyiséghez tartozó változópár: – az egyik a mennyiség belépéskori értéke – a másik a kilépéskor érvényes érték. Pl.: ha a hívás: hossza(Lista, 0) akkor honnan tudjuk meg a kérdéses hosszat? Helyes megoldás: hossza(Lista, 0, Eredmeny) Vagy: hossza(Lista, H) :- hossza(Lista, 0, H).
8
ISMÉTLÉS – LISTÁK Lista: elemek felsorolása [Fej | Torzs] elemlista [] üres lista
9
ISMÉTLÉS – LISTÁK Listafeldolgozás: ?- feldolgoz(Lista). feldolgoz([Fej | Torzs]) :- muvelet(Fej), feldolgoz(Torzs). + leállási feltétel De lehet: feldolgoz([Fej | Torzs]) :- feldolgoz(Torzs), muvelet(Fej). Vagyis a tényleges művelet lehet: a/ a listába „befelé” menet b/ „kifelé” jövet.
10
LISTÁK – PÉLDÁK Listaelemek olvasása: olvas([Fej|Torzs]) :- read(Fej), olvas(Torzs). olvas([]). Probléma:Sohasem áll meg. olvas([]). olvas([Fej|Torzs]) :- read(Fej), olvas(Torzs). Probléma:Azonnal megáll, eredmény: []
11
LISTÁK – PÉLDÁK Listaelemek olvasása: olvas([Fej|Torzs]) :- read(Fej), Fej \= vege, olvas(Torzs). olvas([]). FONTOS: – a felhasználóval mindig közölni kell, hogy mi a végjel – és azt is, hogy adatot várunk vagyis: olvas([Fej|Torzs]) :- writef(…), read(Fej),… „Odafelé” vagy „visszafelé” tölti fel a listát?
12
LISTÁK – PÉLDÁK Listaelemek olvasása másképp: olvas(L) :- olvas([],L). olvas(Eddig, Lista) :- writef(…), read(Elem), Elem \= vege, olvas([Elem|Eddig], Lista). olvas(Lista,Lista). „Odafelé” vagy „visszafelé” tölti fel a listát? Eredmény: a beolvasási sorrend fordítottja.
13
LISTÁK – PÉLDÁK Listaelem törlése: torol(Elem, [Elem | Torzs], Torzs). torol(Elem, [Fej | Torzs], [Fej | Torzs2] ) :- torol(Elem, Torzs, Torzs2). torol(_, [], [] ). Többszörös előfordulás törlése: torol(Elem, [Elem | Torzs], Torzs2) :- torol(Elem, Torzs, Torzs2). % torol( elem, régi_lista, új_lista)
14
LISTÁK – PÉLDÁK torol(Elem, [Fej | Torzs], [Fej | Torzs2] ) :- torol(Elem, Torzs, Torzs2). torol(Elem, [Elem | Torzs], Torzs2) :- torol(Elem, Torzs, Torzs2). ea, b, e, c, e, d, f e b, e, c, e, d, f a, b, c, d, f b, c, d, f ee, b, e, c, e, d, f e b, e, c, e, d, f b, c, d, f
15
LISTÁK – PÉLDÁK Listaelem beszúrása: torol(Elem, [Elem | Torzs], Torzs). torol(Elem, [Fej | Torzs], [Fej | Torzs2] ) :- torol(Elem, Torzs, Torzs2). torol(_, [], [] ). Vagyis ugyanez, csak ha a hívás pl. torol( a, [b,a,d,e], L) – akkor törlés torol(a, L, [b,d,e]) – akkor beszúrás (több alternatív megoldás) % torol( elem, régi_lista, új_lista)
16
LISTÁK – PÉLDÁK Listák összefűzése: % fuz(egyik, masik, harmadik) fuz([Fej|L1Torzs], L2, [Fej|L3Torzs] ) :- fuz(L1Torzs, L2, L3Torzs). fuz([], L, L). a, b, cd, e b, cd, e a, b, c, d, e b, c, d, e
17
LISTÁK – PÉLDÁK fuz([Fej|L1Torzs], L2, [Fej|L3Torzs] ) :- fuz(L1Torzs, L2, L3Torzs). fuz([], L, L). [trace] 2 ?- fuz([a,b,c],[d,e],L). Call: (6) fuz([a, b, c], [d, e], _G549) ? creep Call: (7) fuz([b, c], [d, e], _G631) ? creep Call: (8) fuz([c], [d, e], _G634) ? creep Call: (9) fuz([], [d, e], _G637) ? creep Exit: (9) fuz([], [d, e], [d, e]) ? creep Exit: (8) fuz([c], [d, e], [c, d, e]) ? creep Exit: (7) fuz([b, c], [d, e], [b, c, d, e]) ? creep Exit: (6) fuz([a, b, c], [d, e], [a, b, c, d, e]) ? L = [a, b, c, d, e].
18
LISTÁK – PÉLDÁK fuz([Fej|L1Torzs], L2, [Fej|L3Torzs] ) :- fuz(L1Torzs, L2, L3Torzs). fuz([], L, L). [trace] 3 ?- fuz([a,b,c],L,[a,b,c,d,e]). Call: (6) fuz([a, b, c], _G593, [a, b, c, d, e]) ? creep Call: (7) fuz([b, c], _G593, [b, c, d, e]) ? creep Call: (8) fuz([c], _G593, [c, d, e]) ? creep Call: (9) fuz([], _G593, [d, e]) ? creep Exit: (9) fuz([], [d, e], [d, e]) ? creep Exit: (8) fuz([c], [d, e], [c, d, e]) ? creep Exit: (7) fuz([b, c], [d, e], [b, c, d, e]) ? creep Exit: (6) fuz([a, b, c], [d, e], [a, b, c, d, e]) ? creep L = [d, e].
19
LISTÁK – PÉLDÁK Lista megfordítása: % fordit(régi_lista, új_lista) fordit([],[]). fordit([F|T],Forditott):-fordit(T,Tford), fuz(Tford,[F],Forditott). Logikailag jó, de rossz hatásfokú! (n 2 nagyságrendű)
20
LISTÁK – PÉLDÁK Lista megfordítása (hatékonyabb): % fordit(regi,uj) % fordit(regi, temp, uj) fordit(Regi, Uj) :- fordit(Regi, [], Uj). fordit([F|T], Eddig, Uj) :- fordit(T, [F|Eddig], Uj). fordit([], L,L). a,b, c b, c c [] a b, a c, b, a
21
LISTÁK – PÉLDÁK Lista elemeinek szétválogatása: % valogat(eredeti_lista, jo_lista, nemjo_lista) % jó: a feltételnek megfelelő valogat([],[],[]). valogat([F|T],, ) :- feltetel(F), valogat(T, Jo, Rossz). valogat([F|T],, ) :- valogat(T, Jo, Rossz). Mikor válogat? A listába „befelé” menet, vagy „kifelé”? A másik irány: HF [F|Jo]Rossz Jo[F|Rossz]
22
LISTÁK – PÉLDÁK Ezek után: Hogyan lehet összeadni egy olyan listában lévő számokat, amelyik vegyesen tartalmazhat számokat is és nem számokat is?
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.