Az órán elhangzottak és a html jegyzet megfelelő fejezetei alapján próbálja meg kiegészíteni az alábbi vázlatot! (Az lenne az igazi, ha az órán is írogatna ebbe a fájlba, de utána otthon ne a sajátját, hanem a witch-en lévőt töltse le, és próbálja meg most már önállóan kiegészíteni.) ELSŐ RÉSZ PROLOG = PROgramming in LOGic = programozás a logikában - logikai programozás Vannak "dolgok" - ezekről állítunk valamit. Objektumok (dolgok) - elnevezés: TERM (terminus technikus) Pl.: ... Állítás: ezekről a term-ekről állítunk valamit - elnevezés: PREDIKÁTUM (prédikálni) Pl.: ... Ezek a tényállítások. Pl.: Kék az ég: kék(ég). vagy: Az ég színe kék. : ... Józsi okos : a/ ... b/ ... Józsi fizetése 50000 Ft. : ... Következtetés: HA süt a nap, AKKOR kék az ég. HA szereti Jancsi Juliskát ÉS szereti Juliska Jancsit, AKKOR szerelmesek Jancsi és Juliska. DE a KÖVETKEZMÉNYEN VAN A HANGSÚLY, vagyis: kék az ég HA süt a nap. szerelmes Jancsi és Juliska HA szereti Jancsi Juliskát ÉS szereti Juliska Jancsit. Prologban: a HA jelölése: :- (kettőspont vonal) az ÉS jele: , (vessző) vagyis az előző mondatok: ... FONTOS: Minden Prolog szabály következmény :- feltétel_1, feltétel_2, ....feltétel_n. alakú, vagyis a feltételek ÉS kapcsolatban vannak, illetve CSAK EGY következmény rész van. Megjegyzés: Egy Prolog szabály egy Horn klóznak felel meg, vagyis olyan implikáció, amelynek következmény részében csak egyetlen állítás szerepel. Prolog példa: Minden diák okos. Prolog formalizmussal: ... Vegyünk hozzá a szabályhoz néhány konkrét diákot (vagyis néhány tényt)! ... Sok fajta Prolog interpretáció létezik, órán az SWI-PROLOG-ot vesszük, mert... Letölthető: http://www.swi-prolog.org (Egyéb információkért is érdemes átbogarászni ezt az oldalt.) Az SWI prolog szintaktikája: Kisbetű - nagybetű ; konstans - változó. Különböző term-nevek pl.: ab, Ab, aB, AB Ezek közül változó:... konstans:... Minden mondat végére pontot kell rakni!! (Majd az adatok és a kérdés végére is!) FIGYELEM: predikátumnév - zárójel: A PREDIKÁTUMNÉV ÉS A ZÁRÓJEL KÖZÖTT NEM LEHET SZÓKÖZ!! Feladat: Ünnepeljük meg az első Prolog órát, menjünk kocsmázni! Vigyázat, csak virtuálisan :)) Vagyis: tudjuk, hogy melyik diák milyen italt szeret. Azt is tudjuk, melyik kocsmában milyen italt árulnak. Kérdés: ki hova megy, ha mindenki olyan helyre jár, ahol mérnek olyan italt, amit ő szeret. Kitérő: Hogyan lehet megoldani a feladatot pl. C-ben/Java-ban? (Aki akarja, házi feladatként meg is oldhatja, most csak vázlatosan.) Szükséges adatszerkezetek:... Szükséges utasításszerkezetek:... Ugyanez Prologban: Adatszerkezetek: a tényállítások - vagyis ki mit szeret, ill. hol mit árulnak: Utasítások - nincsenek! Helyette szabály: egy (tetszőleges) diák elmegy egy (tetszőleges) kocsmába, ha a diák szeret valamilyen italt, és árulnak olyan italt abban a kocsmában. Prologban: Lényeges különbség a két megközelítés között: deklaratív - procedurális (imperatív) nyelv. (Emlékszik még rá? :)) Eddig tanult procedurális nyelvek pl.:... Deklaratív nyelv pl.:... FONTOS!! : A HELP és a trace használata!!! Kézikönyv (manual): http://www.swi-prolog.org/download/stable/doc/SWI-Prolog-6.6.6.pdf (Úgy látom, hogy szó szerint azonos az online help-pel.) További feladatok: 1. A "kocsmás" példa bővítése: a kocsmába járáshoz nem elég, hogy valaki szeret inni, kell hozzá némi pénz is. Iktassunk be további állításokat: adjuk meg, kinek mennyi pénze van. (Nem muszáj, hogy minden név azonoslegyen az italt kedvelőkkel!) Iktassunk be egy olyan szabályt, amely szerint valaki gazdag, ha x (pl. 1000) Ft-nál több pénze van. Bővítsük ki a kocsmába járás feltételét avval, hogy még gazdag is az illető. (Pl. van legalább 1000 Ft-ja.) (Megjegyzés: az "igazi" az lenne, ha a "gazdag" szabályba NEM építené be fixen az 1000-t, hanem paraméterként adná át az x-t.) Írja meg a megfelelő programot! (Relációjelek: < > >= =< figyeljen a kisebb-egyenlőre!) 2. Valaki sertést, kecskét és juhot vásárolt, összesen 100 db-t, pontosan 100 aranyért. A sertés darabja 3 és fél arany, a kecskéé 1 és egyharmad, a juhoké fél arany. Hány darabot vett az egyes állatokból? (Próbálja meg végiggondolni! Segítség: használja a between(Also,Felso,Szam) beépített eljárást, amely megadja az összes Also =< Szam =< Felso egész Szam-ot. Részleteket ld. help-ben. Ha nagyon nem megy, de csak akkor!!! nézze meg a megoldást a peldak könyvtárban. ) 3. Tényként vegye fel, hogy kinek mennyi az átlaga, ill. hol lakik. Állapítsa meg, hogy kik lehetnek kollégisták, ha annak feltétele, hogy valaki vidéki legyen, és kellően jó átlaga legyen. (Természetesen rábízom a fantáziájára, hogy milyen esetleges egyéb feltételeket talál még ki.) Gondolja végig, hogyan lehet ábrázolni a "vidékiséget". (több féle módon is!) 4. A peldak könyvtárban találja a Maigret.pl fájlt. a/ Olvassa át, és csak olvasás alapján próbálja meg megmondani, hogy - kik a gyanús személyek; - ki a gyilkos b/ Ellenőrízze a fenti kérdésekre adott válaszát a program lefuttatásával is. MÁSODIK RÉSZ 1. Irja át Prologba: A és B testvérek:(elég a legalább féltestvér) testver(A,B) :- szuloje(A,B) :- (Odafigyelt, hogy a testvér fogalmában ne legyen benne az egyke?) 2. Tegyük fel, hogy csak apák és fiúk vannak. Írja fel az apja(Öreg,Fiatal), ill. a menet közben bevezetett predikátumok segítségével a következőket: nagyapja(A,B) :- dédapja(A,B) :- ükapja(A,B) :- szépapja(A,B) :- őse(A,B) :- 3. Adott a csaladfa.bmp ábrán szereplő családfa. Irjuk át ezt a családfát Prologba! 4. Értékeljük ki az őse(b,Ki) célt! Kiket keresünk? Válasz: az egységesítő illesztés segítségével. Illeszteni predikátumokat tudunk. Az illesztés feltételei: a. b. c. d. Szép lassan és megértve! nézze végig a peldak\csaladfa.pps képeit! 5. Hogy lehetne másképp felírni az "őse" szabályt? (Logikailag azonos, de más sorrendben.) Értékeljük ki így is az eredeti célt! Mit tapasztal? 6. Nézze át a peldak\pletyka.pl programot - javítsa ki "kölcsönös" ismeretségre. 7. Próbálja ki a csinald.pl programot. Figyelje meg a különböző operátorok hatását, és azt is, hogy a Prologban NINCS értékadás! Lényeges különbség a procedurális és deklaratív nyelvek változó fogalma között: procedurális: a változó egy memóriarekesz "neve". deklaratív: a változó egy érték "neve". Prologban csak összehasonlítás van, de "jóindulatú" összehasonlítás, vagyis olyan, hogy ha egy változónak még nincs értéke, akkor igyekszik olyan értéket találni, hogy igazzá tehesse vele az állítást. (egyenletmegoldás) A változó hatóköre KIZÁRÓLAG az a szabály, amelyben használjuk. Szűrjük le a tapasztalatokat: Mit jelent az is/2 operátor? .... Az =/2 jelentése: .... A változó szerepe: ... Mi történik R-rel a csinald4 szabályban? ... 8. Írjon Prolog "beléptető rendszert". Adott néhány felhasználó adata (név-jelszó pár), pl.: felhasznalo(gipsz, jakab). stb. Ha a program használója helyesen gépeli be a nevet és a jelszót, akkor a program írja ki, hogy sikeres belépés, ha nem akkor kérje be újra az adatokat. a/ Addig kérje újra, ameddig nem jó a megadott pár. b/ legföljebb N-szer próbálkozhat. Néhány tudnivaló: beolvasás: read(Valtozo), kiíratás: write(adat) vagy writeln(adat) - ez egyetlen adatot ír ki a végén vagy nincs soremelés, vagy van. Ha egy kiíratással több adatot is szeretne, akkor fapados megoldásként most még jó, ha több write-t használ egymás után, de megnézheti a help-ben a writef szintaktikáját is, de a hanoi.txt fájlban is szerepel. pl.: write('neve'), read(Nev). (Szöveget aposztrofok közé kell írni.) További feladatok: 9. Irja fel a saját családfáját a/ csak az apa-fiú ágakat b/ csak az anya-leány ágakat c/ teljes családfát legalább dédszülőkig, de inkább ükszülőkig. (Természetesen tényként csak a közvetlen kapcsolatokat vegye fel, a leszármazást már szabállyal fogalmazza meg!) 10. Oldjon meg legalább kettőt a feladatok\matek.txt feladatok közül. Kicsit több fejtörést igényel, de gondolkozzon el az eletkor.txt feladaton is. 11. Oldja meg a hanoi torony problémáját. (ld. feladatok/hanoi.txt) 12. Oldjon meg legalább egyet a feladatok/kitalalos_feladatok.txt feladok közül. 13. A bor világnapján egy falu polgármestere csapraveret egy 100 (általában N) literes hordót, amelyből ki-ki annyit tölthet magának, amennyit akar, amíg van bor. Irjon programot, amely mindig mutatja (kiírja), hogy épp hány liter van a hordóban. Módosítás: most a leállás feltétele az, hogy kifogy a hordó. Módosítsa úgy, hogy hamarabb is meg lehessen állni. (vagyis ha van még ital a hordóban, akkor kérdezze meg, hogy folytassuk-e vagy sem) 14. Nézze át a peldak\ut.pl programot. Futtassa nyomkövetéssel! Keressen hibákat a programban! (Több tartalmi hiba is van benne.) FONTOS MEGJEGYZÉSEK: 1. Nagyon fontos, hogy minél gyakrabban használja a nyomkövetést - részben hibakereséshez, részben pedig a Prolog "gondolkozásmódjának" megértéséhez. Két használati mód: a/ szöveges képernyő b/ grafikus felület. a/: A "?-" után gépelje be: trace. Hatása: Yes [trace] ?- most ide kell begépelni a kérdést, pl.: jar(Ki,sarok). b/ Mielőtt begépelné a trace. szót, a Debug menüpontban indítsa el a Grafikus debugger-t. Utána minden ugyanaz, mint az előbb, csak a válasz felülete lesz más. Ha egyszer bekapcsolta a grafikus debuggert, akkor amíg ki nem lép a prolog futtató felületéből, addig mindig grafikus módban marad. 2. Programírási eszközök: a/ közönséges editor (notepad) b/ Emacs: indítása: a kérdőjel után gépelje be, hogy emacs. (Ez egy Prologra kihegyezett, "high-lighting" editor.) c/ swi-prolog editor letöltés, használati útmutató: http://swi-prolog-editor.software.informer.com/ (Az itt található változatot nem próbáltam ki, egy korábbi verziót töltöttem le másik, már nem élő linkről, de nem nagyon szerettem – ez viszont határozottan szubjektív dolog, lehet, hogy Önnek nagyon fog tetszeni, próbálja ki. :)) d/ Keres magának egy kellemes editort. (zh-n a/ és b/ lesz elérhető, igény szerint a c is) 3. Használja minél gyakrabban a HELP-et!