I. ISMÉTLÉS ----------- A Prolog "mögötti" algoritmusok: - egységesítő helyettesítés - visszalépéses algoritmus (cut, fail) Elágazás, "ciklus" a Prologban ismetel. ismetel :- ismetel. Változó, "értékadás" fogalma a Prologban. 1./ peldak/csinald.pl 2./ A csaladfa.bmp "család" esetén mi az eredménye az ose(b,Ki) kérdésnek, ha a/ ose(A,B) :- apja(A,B). ose(A,B) :- apja(A,C), ose(C,B). b/ ose(A,B) :- apja(A,B). ose(A,B) :- ose(A,C), apja(C,B). c/ ose(A,B) :- ose(A,C), apja(C,B). ose(A,B) :- apja(A,B). I/b: FAIL, CUT 1. lakik(jani, szeged). lakik(éva, pécs). lakik(tamás, budapest). lakik(gábor, ózd). lakik(kati, szekszárd). lakik(sanyi, pécs). atlag(jani, 3). atlag(éva, 4.2). atlag(tamás, 3.8). atlag(gábor, 4.5). atlag(kati, 3.1). atlag(sanyi, 3.4). videki ... jotanulo ... /* fogalmazza meg, hogy ki a vidéki, ki a jó tanuló, és ezek alapján ki a kollégista, és írassa ki őket */ 2./ peldak/fovaros.pl II. PÉLDÁK REKURZIÓRA ("ciklus") -------------------------------- 1. Határozzuk meg n! értékét! (írjunk rá Prolog programot :)) Remélem, az előző konzultáció óta már megoldotta ezt a feladatot, vagy legalábbis elgondolkozott rajta. :) Akár igen, akár nem, beszéljük meg. Alapötlet: 1! = 1 N! = (N-1)! * N, ha N>1 Hogy jelölhető Prologban az N!? írjuk fel a szabályt a fenti képlet alapján: (puska: a html ide vonatkozó fejezete) Értékeljük ki a fakt(3,F) célt! Probálja ki nyomkövetéssel is!!! 2. Faktoriális másképp C-ben, Javaban nem rekurzív módon (is) tanulták. Miért? Melyik a hatékonyabb? A nem rekurzív algoritmus: (egészítse ki! - I a ciklusváltozó) I = ; P = ; ciklus amíg P = ; I = ; ciklusvég (P a szorzat éppen aktuális értéke.) Ugyanez prologban: Értékeljük ki a fakt(3,F) célt! (Nyomkövetéssel!!) Mi a különbség? Melyik a hatékonyabb? Miért? Megjegyzés: az aláhúzás "változónév". Mikor használjuk? Miért? 3. Faktoriális még másképp Próbálja meg kitalálni, ha nem, "puskázzon" a html-ből. 4. Nézze át a peldak\jobbrekurzio.pl fájlt. ha akarja, ki is próbálhatja - de csak otthon :). 5./ Mi a baj a hibas.pl programmal? További feladatok 5. Olvassuk be N értékét és irassuk ki a hozzá tartozó faktoriálist! kiiratás: write(paraméter) - a write-nak csak egyetlen paramétere lehet, vagyis pl. a 3!=6 alakú kiiratás: write(N),write('!='),writeln(F) (a writeln/1 a kiírás után sort is emel) Igényesebb kiíratás: writef/2 pl.: writef('első adat: %w második adat: %w', [Elso,Masodik]) (Akit érdekel, a többi formázó stringet ld. a help-ben.) beolvasás: write('kérem a számot: '), read(N) Persze mindez szabálytörzsön belül! 6. Nézze át a peldak\ut.pl programot. Futtassa nyomkövetéssel! Keressen hibákat a programban! (Több tartalmi hiba is van benne.) Mi a probléma az ut.pl feladattal? Javítási ötletek: HF: próbálja meg kijavítani a kitalált javítási ötletek (ill. a mai órán tanultak) alapján. III. LISTÁK ----------- 1. Példák listákra: ... A lista és a tömb közötti különbség: ... 2. Feladatok listakezelésre a/ Állapítsuk meg, hogy egy név szerepel-e egy névsorban (vagyis egy elem benne van-e egy listában)! b/ Állapítsuk meg, hány elemből áll egy lista! Megoldási ötlet: ugyanaz, mint a faktoriális - itt is lehet (sőt legyen is) két változat, egy jobb-rekurziós, ill. egy közönséges rekurziós: c/ nézze végig nyomkövetéssel a listak1.pl fájlt. 4. További feladatok: - füzzünk össze két listát - fordítsuk meg egy lista elemeinek sorrendjét - határozzuk meg egy lista utolsó elemét - utolsó két elemét - határozzuk meg egy lista adott sorszámú elemét állapítsuk meg, hogy egy adott elemnek mi a sorszáma - határozzuk meg egy elem rákövetkezőjét - szúrjunk be egy elemet egy listába most úgy szúrjuk be, hogy minden elem csak egyszer szerepelhessen - határozzuk meg egy lista elemeinek permutációit - határozzuk meg egy számokból álló lista elemeinek összegét Ellenőrizze, hogy tényleg számokat tartalmaz-e a lista. (ld. help number/1) - határozzuk meg egy számokból álló lista elemeinek maximumát/minimumát - valamilyen szempont alapján válogassa szét egy lista elemeit (pl. negatív és nem negatív számok; magánhangzók, mássalhangzók, stb.) HF. 1. Nézze át a html jegyzet fejezeteit az elejétől a "rekurzió kontra iteráció" címűig. (kb. eddig volt az első konzultáció :)) A fejezetek végén talál gyakorló feladatokat. ftp://witch.pmmf.hu:2001/Tanszeki_anyagok/Rendszer-_es_Szoftvertechnologiai_Tanszek/achs/logikai_programozas/ 2. Nézze át a html jegyzet listákra vonatkozó fejezetét, és próbáljon meg minél többet megoldani a fenti feladatokból, illetve a html-ben található feladatokból. 3. Próbálja meg kijavítani az útvonalkereső programot: javítási ötlet: ut(Start, Cel, Eddig_vizsgalt_varosok, Utvonal) ha az új városban már jártunk, akkor onnan ne keressünk tovább. FONTOS: Programíráskor próbáljon meg strukturáltan írni - sokkal könnyebben olvasható a program, és persze Ön is jobban átlátja. Néhány ötlet: szabályfej :- törzs törzs folytatása. (Vagyis a törzset a törzs alatt folytassa) zárójel, pontosvessző használata (de nem muszáj használni, lehet helyette több szabályt is írni) szabályfej :- ( egyik rész ) ; ( másik rész ). Így jobban olvasható a struktúra, mint ömlesztve.