1 / 23

Logikai programozás

Logikai programozás. 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. ISMÉTLÉS. Fibonacci sorozat:. b/

grace
Télécharger la présentation

Logikai programozás

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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] elem lista [] ü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, régi_lista, új_lista) 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).

  14. LISTÁK – PÉLDÁK torol(Elem, [Fej | Torzs], [Fej | Torzs2] ) :- torol(Elem, Torzs, Torzs2). e a, b, e, c, e, d, f e b, e, c, e, d, f a, b, c, d, f b, c, d, f torol(Elem, [Elem | Torzs], Torzs2) :- torol(Elem, Torzs, Torzs2). e e, b, e, c, e, d, f e b, e, c, e, d, f b, c, d, f b, c, d, f

  15. LISTÁK – PÉLDÁK Listaelem beszúrása: % torol( elem, régi_lista, új_lista) 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)

  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, c d, e b, c d, 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ú! (n2 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 c, b, a c, b, a c, 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). [F|Jo] Rossz Jo [F|Rossz] Mikor válogat? A listába „befelé” menet, vagy „kifelé”? A másik irány: HF

  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?

More Related