Deklaratív programozás KÖVETELMÉNYEK, TUDNIVALÓK. Deklaratív programozás: tudnivalók (folyt.) Deklaratív programozás: tudnivalók
|
|
- Krisztián Bakos
- 6 évvel ezelőtt
- Látták:
Átírás
1 DP-1 Deklaratív programozás Hanák Péter Irányítástechnika és Informatika Tanszék KÖVETELMÉNYEK, TUDNIVALÓK Szeredi Péter Számítástudományi és Információelméleti Tanszék (Követelmények) DP-3 DP-4 Deklaratív programozás: tudnivalók Deklaratív programozás: tudnivalók (folyt.) Honlap, levelezési lista Honlap: < Levlista: < A listatagoknak szóló levelet a <dp-l@ címre kell küldeni. Csak a feliratkozottak levele jut el moderátori jóváhagyás nélkül a listatagokhoz. Jegyzet Szeredi Péter, Benkő Tamás: Deklaratív programozás. Bevezetés a logikai programozásba (1000 Ft) Hanák D. Péter: Deklaratív programozás. Bevezetés a funkcionális programozásba (850 Ft) Elektronikus változata elérhető a honlapról (ps, pdf) A nyomtatott változat megvásárolható a SZIT tanszék V2 épületbeli titkárságán a V2.104 szobában, Bazsó Lászlónénál, 10:30-12:00 (hétfő-péntek) és 13:30-15:30 (hétfő-csütörtök). Fordító- és értelmezőprogramok SICStus Prolog 3.12 verzió (licensz az ETS-en keresztül kérhető) Moscow SML (2.0, szabad szoftver) Mindkettő telepítve van a kempelen.inf.bme.hu-n Mindkettő letölthető a honlapról (linux, Win95/98/NT) Webes gyakorló felület az ETS-ben (ld. honlap) Kézikönyvek HTML-, ill. PDF-változatban Más programok: swiprolog, gnuprolog, poly/ml, smlnj emacs-szövegszerkesztő SML-, ill. Prolog-módban (linux, Win95/98/NT) (Követelmények) (Követelmények)
2 DP-5 DP-6 Deklaratív programozás: félévközi követelmények Deklaratív programozás: félévközi követelmények (folyt.) Nagy házi feladat (NHF) Programozás mindkét nyelven (Prolog, SML) Mindenkinek önállóan kell kódolnia (programoznia)! Hatékony (időlimit!), jól dokumentált ( kommentezett ) programok A két programhoz közös, 5 10 oldalas fejlesztői dokumentáció (TXT, TeX/LaTeX, HTML, PDF, PS; de nem DOC vagy RTF) Kiadás a 6. héten, a honlapon, letölthető keretprogrammal Beadás a 12. héten; elektronikus úton (ld. honlap) A beadáskor és a pontozáskor külön-külön tesztsorozatot használunk (nehézségben hasonlókat, de nem azosakat) A minden tesztesetet hibátlanul megoldó programok létraversenyen vesznek részt (hatékonyság, gyorsaság plusz pontokért) Nagy házi feladat (folyt.) Nem kötelező, de nagyon ajánlott! Beadható csak az egyik nyelvből is A beadási határidőig többször is beadható, csak az utolsót értékeljük Pontozása mindkét nyelvből: helyes és időkorláton belüli futás esetén a 10 teszteset mindegyikére 0,5-0,5 pont, összesen max. 5 pont, feltéve, hogy legalább 4 teszteset sikeres a dokumentációra, a kód olvashatóságára, kommentezettségére max. 2,5 pont tehát nyelvenként összesen max. 7,5 pont szerezhető A NHF súlya az osztályzatban: 15% (a 100 pontból 15) (Követelmények) (Követelmények) DP-7 DP-8 Deklaratív programozás: félévközi követelmények (folyt.) Deklaratív programozás: félévközi követelmények (folyt.) Nagyzárthelyi, pótzárthelyi (NZH, PZH, PPZH) Kis házi feladatok (KHF) 2-3 feladat Prologból is, SML-ből is Beadás elektronikus úton (ld. honlap) Nem kötelező, de nagyon ajánlott Minden feladat jó megoldásáért 1-1 jutalompont jár Gyakorló feladatok Nem kötelező, de a sikeres ZH-hoz, vizsgához elengedhetetlen! Gyakorlás az ETS rendszerben (lásd honlap) A zárthelyi kötelező, semmilyen jegyzet, segédlet nem használható! 40%-os szabály (nyelvenként a maximális részpontszám 40%-a kell az eredményességhez). Kivétel: a korábban aláírást szerzett hallgató zárthelyin szerzett pontszámát az alsó ponthatártól függetlenül beszámítjuk a félévvégi osztályzatba. A korábbi félévekben szerzett pontokat nem számítjuk be! Az NZH a 7. hét után, a PZH az utolsó oktatási hetekben lesz A PPZH-ra indokolt esetben, ismétlővizsga-jelleggel a vizsgaidőszak első három hetében egyetlen alkalommal adunk lehetőséget Az NZH anyaga az első két blokk (nagyjából az hét) tananyaga A PZH, ill. a PPZH anyaga azos az NZH anyagával A zárthelyi súlya az osztályzatban: 15% (a 100 pontból 15) Több zárthelyi megírása esetén a zárthelyikre kapott pontszámok közül a legnagyobbat vesszük figyelembe (Követelmények) (Követelmények)
3 Deklaratív programozás: vizsga DP-9 Vizsga Vizsgára az a hallgató bocsátható, aki aláírást szerzett a jelen félévben vagy a jelen félévet megelőző négy félévben A vizsga szóbeli, felkészülés írásban Prolog, SML: több kisebb feladat (programírás, -elemzés) kétszer 35 pontért A vizsgán szerezhető max. 70 ponthoz adjuk hozzá a jelen félévben félévközi munkával szerzett pontokat: ZH: max. 15 pont, NHF: max. 15 pont, továbbá a pluszpontokat (KHF, létraverseny) Korábbi félévben szerzett pontokat nem számítunk be! A vizsgán semmilyen jegyzet, segédlet nem használható, de lehet segítséget kérni Ellenőrizzük a nagy házi feladat és a zárthelyi hitelességét 40%-os szabály (nyelvenként a max. részpontszám 40%-a kell az eredményességhez) Korábbi vizsgakérdések a honlapon találhatók DEKLARATÍV ÉS IMPERATÍV PROGRAMOZÁS (Deklaratív Programozás) Programozási nyelvek osztályozása DP-11 Imperatív és deklaratív programozási nyelvek DP-12 Imperatív program Imperatív Fortran Algol C C++... Programozási nyelvek stílusok Funkcionális LISP ML... Deklaratív Logikai SQL Prolog CLP nyelvek... felszólító módú, utasításokból áll változó: változtatható értékű memóriahely C nyelvű példa: int pow(int a, int n) { // pow(a,n) = a ^ n int p = 1; // Legyen p értéke 1! while (n > 0) { // Amíg n>0 ismételd ezt: n = n-1; // Csökkentsd n-et 1-gyel! p = p*a; } // Szorozd p-t a-val! return p; } // Add vissza p végértékét Deklaratív program kijelentő módú, egyenletekből, állításokból áll változó: egyetlen rögzített értékkel bír, amely a programírás idején még ismeretlen SML példa: fun pow(a, n) = if n > 0 (* Ha n > 0 *) then a*pow(a,n-1) (* akkor a^n = a*a^(n-1) *) else 1 (* egyébként a^n = 1 *) (Deklaratív Programozás) (Deklaratív Programozás)
4 DP-13 DP-14 Deklaratív programozás imperatív nyelven Hatékony deklaratív programozás A rekurziónak van egy hatékonyan megvalósítható változata Lehet pl. C-ben is deklaratívan programozni, ha nem használunk: értékadó utasítást, ciklust, ugrást, stb., amit használhatunk: (rekurzív) függvények, if-then-else Példa (a pow függvény deklaratív változata a powd): /* powd(a,n) = a^n */ int powd(int a, int n) { if (n > 0) /* Ha n > 0 */ return a*powd(a,n-1); /* akkor a^n = a*a^(n-1) */ else return 1; /* egyébként a^n = 1 */ } A (fenti típusú) rekurzió költséges, nem valósítható meg konstans tárigénnyel :-(. Példa: döntsük el, hogy egy a természetes szám előáll-e egy b szám hatványaként: /* ispow(a,b) = 1 <=> exits i, such that b i = a. Precondition: a,b > 0 */ int ispow(int a, int b) { /* again: */ if (a == 1) return 1; else if (a%b == 0) return ispow(a/b, b); /* a = a/b; goto again; */ else return 0; } Itt a rekurzív hívás a kommentben jelzett értékadásokkal és ugrással helyettesíthető! Ez azért tehető meg, mert a rekurzióból való visszatérés után azonnal kilépünk az adott függvényhívásból. Az ilyen függvényhívást jobbrekurziónak vagy terminális rekurziónak nevezzük A Gnu C fordító megfelelő optimalizálási szint mellett (gcc -O2) a rekurzív definícióból is a nem-rekurzív (jobboldali) kóddal azos kódot generál! (Deklaratív Programozás) (Deklaratív Programozás) DP-15 DP-16 Jobbrekurzív függvények Cékla: A Cé nyelv egy deklaratív része Lehet-e jobbrekurzív kódot írni a hatványozási (pow(a,n)) feladatra? A gond az, hogy a rekurzióból kifelé jövet már nem csinálhatunk semmit, tehát a végeredménynek az utolsó hívás belsejében elő kell állnia! A megoldás: segédfüggvény definiálása, amelyben további, ún. gyűjtőargumentumokat helyezünk el. A pow(a,n) jobbrekurzív megvalósítása: /* Segédfüggvény: powa(a, n, p) = p*a^n */ int powa(int a, int n, int p) { if (n > 0) return powa(a, n-1, p*a); else return p; } Megszorítások: Típusok: csak int Utasítások: if-then-else, return, blokk Feltétel-rész: ( kif hasonlító-op kif ) hasonlító-op : < > == \= >= <= kifejezések: változókból és számkonstansokból kétargumentumú operátorokal és függvényhívásokkal épülnek fel aritmetikai-op : + - * / % Egy cékla fordító letölthető a tárgy honlapjáról. int powr(int a, int n){ return powa(a, n, 1); } (Deklaratív Programozás) (Deklaratív Programozás)
5 A Cékla nyelv szintaxisa DP-17 Cékla szintaxis: folytatás DP-18 Utasítások szintaxisa A szintaxist az ún. DCG (Definite Clause Grammar) jelöléssel adjuk meg: terminális jel: [terminális] nem terminális: nem_terminális ismétlés (0, 1, vagy többszöri ismétlés, nincs benne a DCG-ben): (ismétlendő)... A program szintaxisa program --> function_definition.... function_definition --> head, block. head --> type, identifier, [ ( ], formal_args, [ ) ]. type --> [int]. formal_args --> formal_arg, ([","], formal_arg)... ; []. formal_arg --> type, identifier. block --> [ { ], declaration..., statement..., [ } ]. declaration --> type, declaration_elem, declaration_elem..., [ ; ]. declaration_elem --> identifier, [ = ], expression. statement --> [if], test, statement, optional_else_part ; block ; [return], expression, [ ; ] ; [ ; ]. optional_else_part --> [else], statement ; []. test --> [ ( ], expression, comparison_op, expression, [ ) ]. Kifejezések szintaxisa expression --> term, (additive_op, term).... term --> factor, (multiplicative_op, factor).... factor --> identifier ; identifier, [ ( ], actual_args, [ ) ] ; constant ; [ ( ], expression, [ ) ]. constant --> integer. actual_args --> expression, ([, ], expression)... ; []. comparison_op --> [ < ] ; [ > ] ; [ == ] ; [ \= ] ; [ >= ] ; [ <= ]. additive_op --> [ + ] ; [ - ]. multiplicative_op --> [ * ] ; [ / ] ; [ % ]. (Deklaratív Programozás) (Deklaratív Programozás) 1. kis házi feladat DP-19 Egy kicsit bonyolultabb Cékla program DP-20 Az 1. kis házi feladat egy Cékla nyelvű program megírása lesz. Hamarosan feltesszük a tárgy honlapjára A feladat: Egy 0 és 1023 közé eső num egész számot egy olyan 10-jegyű decimális számmá kell konvertálni, amely csak a 0 és 1 jegyekből áll, úgy, hogy ha ezt a 0-1 sorozatot bináris számként olvassuk ki, akkor a num értéket kapjuk, pl. bin(5) = 101, bin(37) = Megoldás (imperatív) C-ben és Céklában: int bin(int num) { int bina(int num, int bp = 512; int bp, int dp = ; int dp, int bin = 0; int bin) { while (bp > 0) { if (bp > 0) { if (num >= bp) { if (num >= bp) num = num-bp; return bina(num-bp,bp/2,dp/10,bin+dp); bin = bin+dp; else } return bina(num, bp/2,dp/10,bin); bp = bp / 2; } dp = dp / 10; if (num > 0) } return -1; if (num > 0) else return -1; return bin; else } return bin; int bind(int num) { } return bina(num, 512, , 0); } (Deklaratív Programozás) (Deklaratív Programozás)
6 Deklaratív programozási nyelvek a Cékla tanulságai DP-21 Deklaratív programozási nyelvek jelmondat DP-22 Mit vesztettünk? a megváltoztatható változókat, az értékadást, ciklus-utasítást stb., általásan: a megváltoztatható állapotot Hogyan tudunk mégis állapotot kezelni deklaratív módon? az állapotot a (segéd)függvény paraméterei tárolják, az állapot változása (vagy helybenmaradása) explicit! Mit nyertünk? Állapotmentes szemantika: egy nyelvi elem értelme nem függ a programállapottól Hivatkozási átlátszóság (referential transparency) pl. ha f(x) = x 2, akkor f(a) helyettesíthető a 2 -tel. Egyszeres értékadás (single assignment) párhuzamos végrehajthatóság. A deklaratív programok dekomponálhatók: A program részei egymástól függetlenül megírhatók, tesztelhetők, verifikálhatók. A programon könnyű következtetéseket végezni, pl. helyességét bizonyítani. MIT és nem HOGYAN (WHAT rather than HOW): a megoldás módja helyett inkább a megoldandó feladat leírását kell megadni A gyakorlatban mindkét szemponttal foglalkozni kell kettős szemantika: deklaratív szemantika MIT (milyen feladatot) old meg a program; procedurális szemantika HOGYAN oldja meg a program a feladatot. (Deklaratív Programozás) (Deklaratív Programozás) Deklaratív programozás miért tanítjuk? DP-23 Egy példa: párbeszéd egy 50 soros Prolog programmal LP-24 Új, magasszintű programozási elemek rekurzió mintaillesztés visszalépéses keresés Új gondolkodási stílus dekomponálható programok: a programrészek (relációk, függvények) önálló jelentéssel bírnak verifikálható programok: a kód és a jelentés összevethető Új alkalmazási területek szimbolikus alkalmazások következtetési módszerekre épülő megoldások nagyfokú megbízhatóságot igénylő rendszerek?- párbeszéd. : Te egy Prolog program vagy. : Magyar legény vagyok én. Felfogtam. Felfogtam. : Ki vagyok én? : Ki vagyok én? Magyar legény Magyar legény Boldog : Péter kicsoda? : Okos vagy. Nem tudom. Felfogtam. : Péter tanuló. : Te vagy a világ közepe. Felfogtam. Felfogtam. : Péter jó tanuló. : Ki vagy te? Felfogtam. egy Prolog program : Péter kicsoda? Okos tanuló a világ közepe jó tanuló : Valóban? : Boldog vagyok. Nem értem. Felfogtam. : Unlak. Én is. (Deklaratív Programozás)
7 A logikai programozás alapgondolata LP-26 Logikai programozás (LP): BEVEZETÉS A LOGIKAI PROGRAMOZÁSBA Programozás a matematikai logika segítségével egy logikai program nem más mint logikai állítások halmaza egy logikai program futása nem más mint következtetési folyamat De: a logikai következtetés óriási keresési tér bejárását jelenti szorítsuk meg a logika nyelvét válasszunk egyszerű, ember által is követhető következtetési algoritmusokat Az LP máig legelterjedtebb megvalósítása a Prolog = Programozás logikában (Programming in logic) az elsőrendű logika egy erősen megszorított résznyelve az ún. definit- vagy Horn-klózok nyelve, végrehajtási mechanizmusa: mintaillesztéses eljáráshíváson alapuló visszalépéses keresés. LP-27 LP-28 Az előadás LP részének áttekintése A Prolog/LP rövid történeti áttekintése 1. blokk: A Prolog nyelv alapjai (6 előadás) Logikai háttér Szintaxis Végrehajtási mechanizmus 2. blokk: Prolog programozási módszerek (6 előadás) A legfontosabb beépített eljárások Fejlettebb nyelvi és rendszerelemek Kitekintés: Új irányzatok a logikai programozásban (1 előadás) 1960-as évek Első tételbizonyító programok A logikai programozás elméleti alapjai (R A Kowalski) 1972 Az első Prolog interpreter (A Colmerauer) 1975 A második Prolog interpreter (Szeredi P) 1977 Az első Prolog fordítóprogram (D H D Warren) Számos kísérleti Prolog alkalmazás Magyarországon 1981 A japán 5. generációs projekt a logikai programozást választja 1982 A magyar MProlog az egyik első kereskedelmi forgalomba kerülő Prolog megvalósítás 1983 Egy új fordítási modell és absztrakt Prolog gép (WAM) megjelenése (D H D Warren) 1986 Prolog szabványosítás kezdete Új logikai programozási nyelvek (CLP, Gödel stb.) Prolog megjelenése párhuzamos számítógépeken Nagyhatékonyságú Prolog fordítóprogramok...
8 Információk a logikai programozásról LP-29 Magyar nyelvű Prolog irodalom LP-30 Prolog megvalósítások: SWI Prolog: SICStus Prolog: GNU Prolog: prolog/ Hálózati információforrások: The WWW Virtual Library: Logic Programming: CMU Prolog Repository: (a címen belül) Főlap: 0.html Prolog FAQ: faq/prolog.faq Prolog Resource Guide: faq/prg_1.faq, faq/prg_2.faq Farkas Zsuzsa, Futó Iván, Langer Tamás, Szeredi Péter: Az MProlog programozási nyelv. Műszaki Könyvkiadó, 1989 jó bevezetés, sajs az MProlog beépített eljárásai nem szabványosak. Márkusz Zsuzsa: Prologban programozni könnyű. Novotrade, 1988 mint fent Futó Iván (szerk.): Mesterséges intelligencia. (9.2 fejezet, Szeredi Péter) Aula Kiadó, 1999 csak egy rövid fejezet a Prologról Peter Flach: Logikai Programozás. Az intelligens következtetés példákon keresztül. Panem John Wiley & Sons, 2001 jó áttekintés, inkább elméleti érdeklődésű olvasók számára English Textbooks on Prolog LP-31 Első Prolog programunk: hatványellenőrzés LP-32 Egy egyszerű példa Céklában és Prologban: /* ispow(a,b) = 1 <=> exits i, such that b i = a. Precondition: a,b > 0 */ Logic, Programming and Prolog, 2nd Ed., by Ulf Nilsson and Jan Maluszynski, Previously published by John Wiley & Sons Ltd. (1995) Downloadable as a pdf file from Prolog Programming for Artificial Intelligence, 3rd Ed., Ivan Bratko, Longman, Paperback - March 2000 The Art of PROLOG: Advanced Programming Techniques, Leon Sterling, Ehud Shapiro, The MIT Press, Paperback - April 1994 Programming in PROLOG: Using the ISO Standard, C.S. Mellish, W.F. Clocksin, Springer-Verlag Berlin, Paperback - July 2003 int ispow(int num, int base) { ispow(num, Base) :- if (num == 1) ( Num =:= 1 return 1; -> true else if (num%base == 0) ; Num rem Base =:= 0, return ispow(num/base, base); Num1 is Num//Base, else ispow(num1, Base) return 0; ). } ispow egy Prolog predikátum, azaz Boole értékű eljárás. Az eljárás egyetlen klózból áll, amely Fej:-Törzs alakú. Az eljárásfejben a paraméterek a Num és Base változók (nagybetűsek!) A törzs egyetlen célt tartalmaz, amely egy feltételes szerkezet: if Felt then Akkor else Egyébként ( Felt -> Akkor ; Egyébként ) A true, A =:= B és A is B szerkezetek beépített predikátumok hívásai.
9 Néhány beépített predikátum LP-33 Programfejlesztési beépített predikátumok LP-34 Egyesítés: X = Y: az X és Y szimbolikus kifejezések változók behelyettesítésével azos alakra hozhatók (és el is végzi a behelyettesítéseket). Aritmetikai predikátumok X is Kif: A Kif aritmetikai kifejezést kiértékeli és értékét egyesíti X-szel. Kif1<Kif2, Kif1=<Kif2, Kif1>Kif2, Kif1>=Kif2, Kif1=:=Kif2, Kif1=\=Kif2: A Kif1 és Kif2 aritmetikai kifejezések értéke a megadott relációban van egymással (=:= jelentése: aritmetikai egyenlőség, =\= jelentése aritmetikai nem-egyenlőség). Ha Kif, Kif1, Kif2 valamelyike nem tömör (változómentes) aritmetikai kifejezés hiba. Legfontosabb aritmetikai operátorok: +, -, *, /, rem, // (egész-osztás) Kiíró predikátumok write(x): Az X Prolog kifejezést kiírja. nl: Kiír egy újsort. Egyéb predikátumok true, fail: Mindig sikerül ill. mindig meghiúsul. trace, trace: A (teljes) nyomkövetést be- ill. kikapcsolja. consult(file) vagy [File]: A File állományban levő programot beolvassa és értelmezendő alakban eltárolja. (File = user terminálról olvas.) listing vagy listing(predikátum): Az értelmezendő alakban eltárolt összes ill. adott nevű predikátumokat kilistázza. compile(file): A File állományban levő programot beolvassa, lefordítja. A lefordított alak gyorsabb, de nem listázható, kicsit kevésbe pontosan nyomkövethető. halt: A Prolog rendszer befejezi működését. > sicstus SICStus (x86-linux-glibc2.3): Mon Oct 20 15:59:37 CEST 2003?- consult(ispow). % consulted /home/user/ispow.pl in module user, 0 msec 376 bytes yes?- ispow(8, 3).?- ispow(8, 2). yes?- listing(ispow). (...) yes?- halt. > Általás (nem Boole-értékű) függvények Prologban LP-35 Predikátum definiálása több klózzal LP-36 Példa: Természetes számok hatványozása Céklában és Prologban: /* powd(a,n) = a^n */ /* powd(a, N, P): A^N = P. */ int powd(int a, int n) { powd(a, N, P) :- if (n > 0) ( N > 0 return a*powd(a,n-1); -> N1 is N-1, powd(a, N1, P1), P is A*P1 else ; P = 1 return 1; ). }?- powd(2, 8, P). P = 256? A 2-argumentumú powd függvénynek a 3-argumentumú powd predikátum felel meg. A függvény két argumentumának a predikátum első két, bemenő, azaz behelyettesített argumentuma felel meg. A függvény eredménye a predikátum utolsó, kimenő argumentuma, amely általában behelyettesítetlen változó. A feltételes szerkezet nem alap-építőeleme a Prolog nyelvnek (az első Prologokban nem is volt) Helyette több egymást kizáró klózt is lehet alkalmazni: /* powd(a, N, P): A^N = P. */ powd(a, N, P) :- powd2(a, N, P) :- ( N > 0 N > 0, -> N1 is N-1, N1 is N-1, powd(a, N1, P1), powd2(a, N1, P1), P is A*P1 P is A*P1. ; P = 1 powd2(a, N, 1) :- N =< 0. ). Ha egy predikátum több klózból áll, a Prolog mindegyiket megkisérli felhasználni a futásban: ha pow2 második paramétere (N) pozitív, akkor az első klózt használja, egyébként (azaz ha N =< 0) a második klózt. Ha powd2 második klózaként powd(a, 0, 1) állna akkor negatív kitevő esetén a hívás meghiúsulna (egyik klóz sem lenne alkalmazható). Általában nem kell kizáró feltételeket alkalmazni, így egy kérdésre több választ is kaphatunk! gyöke(a, B, C, X) :- X is (-B + sqrt(b*b-4*a*c))/(2*a). gyöke(a, B, C, X) :- X is (-B - sqrt(b*b-4*a*c))/(2*a).
10 Több választ adó predikátumok a családi kapcsolatok példája LP-37 A nagyszülő feladat Prolog megoldás LP-38 Adatok Egy gyerek szülő kapcsolat, pl. gyerek szülő Imre István Imre Gizella István Géza István Sarolta Gizella Civakodó Henrik Gizella Burgundi Gizella A feladat: Definiálandó az uka nagyszülő kapcsolat, pl. keressük egy adott személy nagyszüleit. % szuloje(gy, Sz):Gy szülője Sz. szuloje( Imre, István ). szuloje( Imre, Gizella ). szuloje( István, Géza ). szuloje( István, Sarolt ). szuloje( Gizella, Civakodó Henrik ). szuloje( Gizella, Burgundi Gizella ). % Gyerek nagyszülője Nagyszulo. nagyszuloje(gyerek, Nagyszulo) :- szuloje(gyerek, Szulo), szuloje(szulo, Nagyszulo). % Kik Imre nagyszülei??- nagyszuloje( Imre, NSz). NSz = Géza? ; NSz = Sarolt? ; NSz = Civakodó Henrik? ; NSz = Burgundi Gizella? ; % Kik Géza ukái??- nagyszuloje(u, Géza ). U = Imre? ; Adatstruktúrák deklaratív nyelvekben példa LP-39 Bináris fák összegzése LP-40 A bináris fa adatstruktúra vagy egy csomópont (de), amelynek két részfája van mutat (left,right) vagy egy levél (leaf), amely egy egészt tartalmaz Binárisfa-struktúrák különböző nyelveken % Struktúra deklarációk C-ben enum treetype Node, Leaf; struct tree { enum treetype type; union { struct { struct tree *left; struct tree *right; } de; struct { int value; } leaf; } u; }; % Adattípus-deklaráció SML-ben datatype Tree = Node of Tree * Tree Leaf of int % Adattípus-leírás Prologban :- type tree ---> de(tree, tree) leaf(int). Egy bináris fa levélösszegének kiszámítása: csomópont esetén a két részfa levélösszegének összege levél esetén a levélben tárolt egész % C nyelvű (deklaratív) függvény int sum_tree(struct tree *tree) { switch(tree->type) { case Leaf: return tree->u.leaf.value; case Node: return sum_tree(tree->u.de.left) + sum_tree(tree->u.de.right); } } % Prolog eljárás (predikátum) sum_tree(leaf(value), Value). sum_tree(de(left,right), S) :- sum_tree(left, S1), sum_tree(right, S2), S is S1+S2.
11 Bináris fák összegzése LP-41 Pea aritmetika összeadás LP-42 Prolog példafutás % sicstus -f SICStus (x86-linux-glibc2.1): Tue Dec 17 15:12:52 CET 2002 Licensed to BUTE DP course?- consult(tree). % consulting /home/szeredi/peldak/tree.pl... % consulted /home/szeredi/peldak/tree.pl in module user, 0 msec 704 bytes yes?- sum_tree(de(leaf(5), de(leaf(3), leaf(2))), Sum). Sum = 10? ;?- sum_tree(tree, 10). Tree = leaf(10)? ;! Instantiation error in argument 2 of is/2! goal: 10 is _73+_74?- halt. % A hiba oka: a beépített aritmetika egyirányú: a 10 is S1+S2 hívás hibát jelez! A természetes számok halmazán az összeadást definiálhatjuk a Pea axiómákkal ha a számokat az s(x) rákövetkező függvény segítségével ábrázoljuk: 1 = s(0), 2 = s(s(0)), 3 = s(s(s(0))),... (Pea ábrázolás). % plus(x, Y, Z): X és Y összege Z (X, Y, Z Pea ábrázolású). plus(0, X, X). % 0+X = X. plus(s(x), Y, s(z)) :- plus(x, Y, Z). % s(x)+y = s(x+y). A plus predikátum több irányban is használható:?- plus(s(0), s(s(0)), Z). Z = s(s(s(0)))? ; % 1+2 = 3?- plus(s(0), Y, s(s(s(0)))). Y = s(s(0))? ; % 3-1 = 2?- plus(x, Y, s(s(0))). X = 0, Y = s(s(0))? ; % 2 = 0+2 X = s(0), Y = s(0)? ; % 2 = 1+1 X = s(s(0)), Y = 0? ; % 2 = 2+0?- Adott összegű fák építése LP-43 A Prolog adatfogalma, a Prolog kifejezés LP-44 Adott összegű fát építő eljárás Pea aritmetikával: sum_tree(leaf(value), Value). sum_tree(de(left, Right), S) :- Az eljárás futása: plus(s1, S2, S), S1 \= 0, S2 \= 0, sum_tree(left, S1), sum_tree(right, S2). % X \= Y beépített eljárás, jelentése: % X és Y nem egyesíthető % A 0-t kizárjuk, mert különben sok megoldás van.?- sum_tree(tree, s(s(s(0)))). Tree = leaf(s(s(s(0))))? ; % 3 Tree = de(leaf(s(0)),leaf(s(s(0))))? ; % (1+2) Tree = de(leaf(s(0)),de(leaf(s(0)),leaf(s(0))))? ; % (1+(1+1)) Tree = de(leaf(s(s(0))),leaf(s(0)))? ; % (2+1) Tree = de(de(leaf(s(0)),leaf(s(0))),leaf(s(0)))? ; % ((1+1)+1) konstans (atomic) számkonstans (number) egész vagy lebegőpontos, pl. 1, -2.3, 3.0e10 névkonstans (atom), pl. István, ispow, +, -, <, sum_tree összetett- vagy struktúra-kifejezés (compound) ún. kanikus alak: struktúranév ( arg 1,... ) a struktúranév egy névkonstans, az arg i argumentumok tetszőleges Prolog kifejezések példák: leaf(1), person(william,smith,2003,1,22), <(X,Y), is(x, +(Y,1)) szintaktikus édesítőszerek, pl. operátorok: X is Y+1 is(x, +(Y,1)) változó (var) pl. X, Szulo, X2, _valt, _, _123 a változó alaphelyzetben behelyettesítetlen, értékkel nem bír, az egyesítés (mintaillesztés) művelete során egy tetszőleges Prolog kifejezést vehet fel értékül (akár egy másik változót)
12 Predikátumok, klózok LP-46 Példa: % két klózból álló predikátum definíciója, funktora: sum_tree/2 sum_tree(leaf(val), Val). % 1. klóz, tényállítás sum_tree(de(left,right), S) :- % fej \ sum_tree(left, S1), % cél \ sum_tree(right, S2), % cél törzs 2. klóz, szabály S is S1+S2. % cél / / A PROLOG NYELV KÖZELÍTŐ SZINTAXISA Szintaxis: Prolog program ::= predikátum... predikátum ::= klóz... {azos funktorú} klóz ::= tényállítás. szabály. {klóz funktora = fej funktora} tényállítás ::= fej szabály ::= fej :- törzs törzs ::= cél,... cél ::= kifejezés fej ::= kifejezés LP-47 LP-48 Prolog programok formázása Prolog kifejezések Példa egy klózfej mint kifejezés: % sum_tree(de(left,right), S) % összetett kif., funktora sum_tree/2 % _ % % struktúranév argumentum, változó % \- argumentum, összetett kif. Programok javasolt formázása: Az egy predikátumhoz tartozó klózok legyenek egymás mellett a programban, közéjük ne tegyünk üres sort. A predikátumokat válasszuk el üres sorokkal. A klózfejet írjuk sor elejére, minden célt lehetőleg külön sorba, néhány szóközzel beljebb kezdve Szintaxis: kifejezés ::= változó {Nincs funktora} konstans {Funktora: konstans /0} összetett kifejezés {Funktora: struktúranév / arg.szám } ( kifejezés ) {Operátorok miatt, ld. később} konstans ::= névkonstans számkonstans számkonstans ::= egész szám lebegőpontos szám összetett kifejezés ::= struktúranév ( argumentum,... ) struktúranév ::= névkonstans argumentum ::= kifejezés
13 LP-49 LP-50 Lexikai elemek Szintaktikus édesítőszer: operátorok Példák: % változó: Fakt FAKT _fakt X2 _2 _ % névkonstans: fakt fakt István [] ;, += ** \= \\= % számkonstans: e8 % nem névkonstans:!=, Istvan % nem számkonstans: 1e8 1.e2 Szintaxis: változó ::= nagybetű alfanumerikus jel... _ alfanumerikus jel... névkonstans ::= idézett karakter kar... kisbetű alfanumerikus jel... tapadó jel...! ; [] {} egész szám ::= {előjeles vagy előjeltelen számjegysorozat} lebegőpontos szám ::= {belsejében tizedespontot tartalmazó számjegysorozat esetleges exponenssel} idézett karakter ::= {tetszőleges nem és nem \ karakter} \ escape szekvencia alfanumerikus jel ::= kisbetű nagybetű számjegy _ tapadó jel ::= + - * / \ $ ^ < > = ~ # & Példa: % S is -S1+S2 ekvivalens az is(s, +(-(S1),S2)) kifejezéssel Operátoros kifejezések összetett kifejezés ::= struktúranév ( argumentum,... ) {eddig csak ez volt} argumentum operátornév argumentum {infix kifejezés} operátornév argumentum {prefix kifejezés} argumentum operátornév {posztfix kifejezés} operátornév ::= struktúranév {ha operátorként lett definiálva} Operátor-kezelő beépített predikátumok: op(prioritás, Fajta, OpNév) vagy op(prioritás, Fajta, [OpNév 1,OpNév 2,...]): Prioritás: közötti egész Fajta: az yfx, xfy, xfx, fy, fx, yf, xf névkonstansok egyike OpNév: tetszőleges névkonstans pozitív prioritás esetén definiálja az operátor(oka)t, 0 prioritás esetén megszünteti azokat. current_op(prioritás, Fajta, OpNév): felsorolja a definiált operátorokat. LP-51 LP-52 Szabványos, beépített operátorok Operátorok jellemzői Szabványos operátorok 1200 xfx :- --> 1200 fx :-? xfy ; 1050 xfy -> 1000 xfy, 900 fy \+ 700 xfx < = \= =.. =:= =< == \== =\= > 500 yfx + - /\ \/ 400 yfx * / // rem mod << >> 200 xfx ** 200 xfy ^ 200 fy - \ Egyéb beépített operátorok SICStus Prologban 1150 fx dynamic multifile block meta_predicate 900 fy spy spy 550 xfy : 500 yfx # 500 fx + Egy operátort jellemez a fajtája és prioritása A fajta meghatározza az operátor-osztályt (írásmódot) és az asszociatívitást: Fajta Osztály Értelmezés bal-asszoc. jobb-asszoc. nem-asszoc. yfx xfy xfx infix X f Y f(x, Y) fy fx prefix f X f(x) yf xf posztfix X f f(x) Több-operátoros kifejezésben a zárójelezést a prioritás és az asszociatívitás határozza meg, pl. a/b+c*d (a/b)+(c*d) mert / és * prioritása 400, ami kisebb mint a + prioritása (500) (kisebb prioritás = erősebb kötés). a+b+c (a+b)+c mert a + operátor fajtája yfx, azaz bal-asszociatív balra köt, balról jobbra zárójelez (a fajtanévben az y betű mutatja az asszociatívitás irányát) a^b^c a^(b^c) mert a ^ operátor fajtája xfy, azaz jobb-asszociatív (jobbra köt, jobbról balra zárójelez) a=b=c szintaktikusan hibás, mert az = operátor fajtája xfx, azaz nem-asszociatív
14 LP-53 LP-54 Operátorok: zárójelezés Operátorok kiegészítő megjegyzések Induljunk ki egy teljesen zárójelezett, több operátort tartalmazó kifejezésből! Egy részkifejezés prioritása a (legkülső) operátorának a prioritása. Azos nevű, azos osztályba tartozó operátorok egyidejűleg nem megengedettek. Egy program szövegében direktívákkal definiálhatunk operátorokat, pl. :- op(500, xfx, --). :- op(450, Egy op prioritású operátor ap prioritású argumentumát körülvevő zárójelpár elhagyható ha: sum_tree(@v, V). (...) ap < op pl. a+(b*c) a+b*c (ap = 400, op = 500) ap = op, jobb-asszociatív operátor jobboldali argumentuma esetén, pl. a^(b^c) a^b^c (ap = 200, op = 200) ap = op, bal-asszociatív operátor baloldali argumentuma esetén, pl. (1+2) Kivétel: ha a baloldali argumentum operátora jobb-asszociatív, azaz az előző feltétel alkalmazható. Példa a kivétel esetére: :- op(500, xfy, +^).?- :- write((1 +^ 2) + 3), nl. (1+^2)+3?- :- write(1 +^ (2 + 3)), nl. 1+^2+3 tehát: konfliktus esetén az első operátor asszociativitása győz. A vessző kettős szerepe struktúra-kifejezés argumentumait választja el 1000 prioritású xfy operátorként működik pl.: (p :- a,b,c) = :-(p,, (a,, (b,c))) a pucér vessző (,) nem névkonstans, de operátorként aposztrofok nélkül is írható. struktúra-argumentumban 999-nél nagyobb prioritású kifejezést zárójelezni kell:?- write_canical((a,b,c))., (a,, (b,c))?- write_canical(a,b,c).! procedure write_canical/3 does t exist Az egyértelmű elemezhetőség érdekében a Prolog szabvány kiköti, hogy operandusként előforduló operátort zárójelbe kell tenni, pl. Comp = (>) nem létezhet azos nevű infix és posztfix operátor. Sok Prolog rendszerben nem kötelező betartani ezeket a megszorításokat. LP-55 LP-56 Operátorok felhasználása Aritmetika Prologban Mire jók az operátorok? aritmetikai eljárások kényelmes irására, pl. X is (Y+3) mod 4 aritmetikai kifejezések szimbolikus feldolgozására (pl. szimbolikus deriválás) klózok leírására (:- és, is operátor) klózok átadhatók meta-eljárásoknak, pl asserta( (p(x):-q(x),r(x)) ) eljárásfejek, eljáráshívások olvashatóbbá tételére: :- op(800, xfx, [nagyszülője, szülője]). Gy nagyszülője N :- Gy szülője Sz, Sz szülője N. adatstruktúrák olvashatóbbá tételére, pl. :- op(100, xfx, [.]). sav(kén, h.2-s-o.4). Miért rosszak az operátorok? egyetlen globális erőforrás, ez nagyobb projektben gondot okozhat. Az operátorok teszik lehetővé azt is, hogy a matematikában ill. más programozási nyelvekben megszokott módon írhassunk le aritmetikai kifejezéseket. Az is beépített predikátum egy aritmetikai kifejezést vár a jobboldalán (2. argumentumában), azt kiértékeli, és az eredményt egyesíti a baloldali argumentummal Az =:= beépített predikátum mindkét oldalán aritmetikai kifejezést vár, azokat kiértékeli, és csakkor sikerül, ha az értékek megegyeznek. Példák:?- X = 1+2, write(x), write( ), write_canical(x), Y is X (1,2) = X = 1+2, Y = 3? ;?- X = 4, Y is X/2, Y =:= 2. = X = 4, Y = 2.0? ;?- X = 4, Y is X/2, Y = 2. = Fontos: az aritmetikai operátorokkal (+,-,... ) képzett kifejezések összetett Prolog kifejezést jelentenek. Csak az aritmetikai beépített predikátumok értékelik ki ezeket! A Prolog kifejezések alapvetően szimbolikusak, az aritmetikai kiértékelés a kivétel.
15 Klasszikus szimbolikus kifejezés-feldolgozás: deriválás LP-57 Operátoros példa: polim behelyettesítési értéke LP-58 Írjunk olyan Prolog predikátumot, amely számokból és az x névkonstansból a +, -, * műveletekkel képzett kifejezések deriválását elvégzi! % deriv(kif, D): Kif-nek az x szerinti deriváltja D. deriv(x, 1). deriv(c, 0) :- number(c). deriv(u+v, DU+DV) :- deriv(u, DU), deriv(v, DV). deriv(u-v, DU-DV) :- deriv(u, DU), deriv(v, DV). deriv(u*v, DU*V + U*DV) :- deriv(u, DU), deriv(v, DV).?- deriv(x*x+x, D). = D = 1*x+x*1+1? ;?- deriv((x+1)*(x+1), D). = D = (1+0)*(x+1)+(x+1)*(1+0)? ;?- deriv(i, 1*x+x*1+1). = I = x*x+x? ;?- deriv(i, 0). = Formula: számokból és az x névkonstansból + és * operátorokkal felépülő kifejezés. A feladat: Egy formula értékének kiszámolása egy adott x érték esetén. % erteke(kif, X, E): A Kif formula értéke E, az x=x behelyettesítéssel. erteke(x, X, E) :- E = X. erteke(kif, _, E) :- number(kif), E = Kif. erteke(k1+k2, X, E) :- erteke(k1, X, E1), erteke(k2, X, E2), E is E1+E2. erteke(k1*k2, X, E) :- erteke(k1, X, E1), erteke(k2, X, E2), E is E1*E2.?- erteke((x+1)*x+x+2*(x+x+3), 2, E). E = 22? ; LP-60 Logikai alapfogalmak Prolog megfelelői A PROLOG LOGIKAI ALAPJAI A logika nyelvének elemei: (rövid összefoglaló, vö. a Matematikai Logika c. tárgy anyagával) Kifejezés (term): változókból és konstansokból függvények segítségével épül fel, pl f(a, g(x)), ahol f kétargumentumú, g egyargumentumú függvénynév, a konstansnév (azaz 0-argumentumú függvénynév) és X változónév. Elemi állítás: egy relációjel, megfelelő számú argumentummal ellátva, ahol az argumentumok kifejezések, pl. osztja(x, X Y ). Állítás (formula): elemi állításokból logikai összekötő jelekkel (pl.,,, ) és kvantorok (, ) alkalmazásával épül fel, pl. X(X < 0 X < X 2). Prolog konvenciók: A változóneveket nagybetűvel vagy aláhúzásjellel kezdjük. Kétargumentumú függvénykifejezéseket, állításokat infix alakban is írhatunk, pl. X + 2 Y +(X, (2, Y )), X < X 2 < (X, (X, 2)) A függvények (és konstansok) nevét kisbetűvel kezdjük, vagy aposztrofok közé tesszük. Speciális jelek ill. jelsorozatok is megengedettek függvény, konstans, vagy állítás neveként (pl. +,, <).
16 A logika nyelvének megszorítása LP-61 A következtetési folyamat hatékonyabbá tételéhez érdemes a logikai nyelvet szűkíteni. Bevezetjük a klóz (clause) fogalmát. Egy klóz az alábbi alakú logikai állítás: X 1... X j ((F 1... F n ) (T 1... T m )) az implikáció bal (következmény) oldala a klóz feje az implikáció feltétele a klóz törzse, a törzsbeli konjunkció elemeit (rész)céloknak is hívjuk F i és T j elemi állítások, n, m 0, azaz a fej és a törzs is lehet üres. X 1... X j : a klózban szereplő összes változó. A fentivel ekvivalens logikai alak (vö. A B A B): X 1,... X j (F 1... F n T 1... T m ) Klózok egyszerűsített írásmódja: F 1,...,F n : T 1,...,T m. Ha m = 0, a :- jelet elhagyjuk. Példák vigyázat, ezek általás klózok, nem feltétlenül megengedettek Prologban! ferfi(x), (X) :- ember(x). % Aki ember az férfi vagy nő. :- ferfi(x), (X). X (ferfi(x) (X)) % Nincs olyan dolog, ami férfi és nő is. szereti(x, X) :- szent(x). % Minden szentnek maga felé hajlik a keze. szent( István ). % István szent. PROLOG PROGRAMOK JELENTÉSE, VÉGREHAJTÁSA Deklaratív szemantika klózok logikai alakja LP-63 A logika függvényeinek szerepe Prologban LP-64 A matematikai logikában bevezetik az általás klóz fogalmát: F 1,...,F n : T 1,...,T m. X(F 1... F n T 1... T m ) Definit klóz (definite clause) vagy Horn klóz (Horn clause): olyan klóz, amelynek fejében legfeljebb egy elemi állítás szerepel (n 1). Horn klózok osztályozása Ha n = 1, m > 0, akkor a klózt szabálynak hívjuk, pl. nagyszuloje(u,n):-szuloje(u,sz),szuloje(sz,n). logikai alak: UNSz(nagyszuloje(U, N) szuloje(u, Sz) szuloje(sz, N)) ekvivalens alak: UN (nagyszuloje(u, N) Sz(szuloje(U, Sz) szuloje(sz, N))) n = 1, m = 0 esetén a klóz tényállítás, pl. szuloje( Imre, István ). logikai alakja változatlan. n = 0, m > 0 esetén a klóz egy célsorozat, pl. :- nagyszuloje( Imre, X). logikai alak: X nagyszuloje( Imre, X), azaz Xnagyszuloje( Imre, X) Ha n = 0, m = 0, akkor üres klózról beszélünk, jele:. Logikailag üres diszjunkció, azaz azosan hamis. A függvényjelek szerepe A Prolog az ún. egyenlőségmentes logikára (equality-free logic) épül, tehát két függvénykifejezés egyenlőségéról nem állíthatunk semmit. Emiatt Prolog-ban a logika függvényei kizárólag ún. konstruktor-függvények lehetnek: f(x 1,..., x n ) = z (z = f(y 1,..., y n ) x 1 = y 1 )... (x n = y n )) Például leaf(x) = Z Z = leaf(y) X = Y, azaz leaf(x) minden más értéktől különböző, egyedi érték. Példa: sum_tree(leaf(value), Value). sum_tree(de(left,right), S) :- sum_tree(left, S1), sum_tree(right, S2), S is S1+S2.?- sum_tree(de(leaf(1),leaf(2)), Sum). Sum = 3??- sum_tree(tree, 3). Tree =leaf(3)? A kérdésben felépített de(leaf(1),leaf(2)) függvénykifejezést az eljárás egyértelmű módon szétbontja. A mintaillesztés (egyesítés) kétirányú: szétbontásra és építésre is alkalmas.
17 A Prolog deklaratív szemantikája LP-65 Deklaratív szemantika LP-66 Deklaratív szemantika Segédfogalom: egy kifejezés/állítás példánya: belőle változók behelyettesítésével előálló kifejezés/állítás. Egy célsorozat lefutása sikeres, ha a célsorozat törzsének egy példánya logikai következménye a programnak (a programbeli klózok konjunkciójának). A futás eredménye a példányt előállító behelyettesítés. Egy célsorozat többféleképpen is lefuthat sikeresen. Egy célsorozat futása sikertelen, ha egyetlen példánya sem következménye a programnak. Példa: szuloje( Imre, István ). (sz1) szuloje( Imre, Gizella ). (sz2) szuloje( István, Géza ). (sz3) szuloje( István, Sarolt ). (sz4) szuloje( Gizella, Civakodó Henrik ). (sz5) szuloje( Gizella, Burgundi Gizella ). (sz6) nagyszuloje(gy, N) :- szuloje(gy, Sz), szuloje(sz, N). (nsz) :- nagyszuloje( Imre, N). (cel) (sz1) + (sz3) + (nsz) következménye: nagyszuloje( Imre, Géza ), tehát (cel) sikeresen fut le az N = Géza behelyettesítéssel. Egy másik sikeres lefutás, pl. (sz1)+(sz4)+(nsz) alapján N = Sarolt. Miért jó a deklaratív szemantika? A program dekomponálható: külön-külön vizsgálhatjuk az egyes predikátumokat (sőt az egyes klózokat). A program verifikálható: a predikátumok szándékolt jelentésének ismeretében eldönthető, hogy az egyes klózok igaz állításokat fogalmaznak-e meg. Egy predikátum szándékolt jelentését nagyon fontos egy ún. fejkommentben, azaz az argumentumok kapcsolatát leíró kijelentő mondatban megfogalmazni. Példák: Fejkommentek: % szuloje(gy, Sz): Gy szülője Sz. % nagyszuloje(gy, NSz): Gy nagyszülője NSz. nagyszuloje(gy, N) :- szuloje(gy, Sz), szuloje(sz, N). A klóz jelentése: Ha Gy szülője Sz és Sz szülője N, akkor Gy nagyszülője N. Ez megfelel elvárásainknak, igaz állításként elfogadható. Fejkommentek: % sum_tree(t, Sum): A T fa levélösszege Sum. % E is Kif: A Kif aritm. kif. értéke E. (is infix!) sum_tree(de(l,r), S) :- sum_tree(l, S1), sum_tree(r, S2), S is S1+S2. A klóz jelentése: Ha az L fa levélösszege S1, az R fa levélösszege S2, és S1+S2 értéke S akkor a de(l,r) fa levélösszege S. Ez is egy igaz állítás. Deklaratív szemantika (folyt.) LP-67 A Prolog procedurális szemantikája LP-68 Miért nem elég a deklaratív szemantika? A deklaratív szemantika egy általás következményfogalomra épít. A következtetés szükségképpen többirányú, tehát kereséssel jár. Végtelen keresési tér esetén a következtető is végtelen ciklusba eshet. Véges keresési tér esetén is lehet a keresés nagyon rossz hatékonyságú. Egyes beépített predikátumok csak bizonyos feltételek mellett képesek működni. Pl. S is S1+S2 hibát jelez, ha S1 vagy S2 ismeretlen mennyiség. Emiatt sum_tree(de(l,r), S) :- S is S1+S2, sum_tree(l, S1), sum_tree(r, S2). logikailag helyes, de működésképtelen. Ezek miatt fontos, hogy a Prolog programozó ismerje a Prolog pontos végrehajtási mechanizmusát is, azaz a nyelv procedurális szemantikáját. Jelszó: Gondolkodj deklaratívan, ellenőrizz procedurálisan! Azaz: miután megírtad deklaratív programodat, gondold végig azt is, hogy jó lesz-e a procedurális végrehajtása (nem esik-e végtelen ciklusba, elég hatékony-e, működésképesek-e a beépített predikátumok stb.)! A Prolog végrehajtási mechanizmusa többféleképpen is leírható. Különféle megadási módok: Az ún. SLD rezolúciós tételbizonyítási módszer (nagyon tömören lásd alább) egy cél-redukción alapuló tételbizonyítási módszer (lásd a következő fóliákon) mintaillesztésen alapuló visszalépéses eljárásszervezés (részletesen lásd később). A Prologban alkalmazott rezolúciós tételbizonyítási módszerről: SLD resolution: Linear resolution with a Selection function for Definite clauses. A célsorozat tagadja a keresett dolgok létezését, pl. Imre -nek nincs nagyszülője: :- nagyszuloje( Imre, N). N nagyszuloje( Imre, N) A célsorozat és egy programklóz ún. rezolvenseként kapunk egy újabb célsorozatot. A rezolúciós lépéseket addig ismételjük, amíg el nem jutunk az üres klózhoz (zsákutcák esetén visszalépést alkalmazva). Ha ez sikerül, akkor ezzel indirekt módon beláttuk, hogy a célsorozat törzse következik a programból, hiszen a törzs negáltjából és a programból következik az azosan hamis. A rezolúciós bizonyítás konstruktív, siker esetén behelyettesíti a célsorozat változóit ez a keresett válasz (pl. N = Géza ). További válaszok alternatív bizonyításokkal állíthatók elő.
18 A Prolog mint cél-redukciós tételbizonyító LP-69 A redukciós lépés LP-70 Alapgondolat: a megoldandó célt redukáljuk (visszavezetjük) olyan részcélokra, amelyekből ő következik. Példaprogram szuloje( Imre, István ). (sz1) szuloje( Imre, Gizella ). (sz2) szuloje( István, Géza ). (...) (sz3) nagyszuloje(gy, N) :- szuloje(gy, Sz), szuloje(sz, N). (nsz) A kezdeti célsorozat: :- nagyszuloje( Imre, N). (Most a célsorozatot úgy tekintjük mint bizonyítandó állítások sorozatát.) Kiegészítjük a célsorozatot egy vagy több speciális céllal, a keresett változók értékének megőrzése érdekében: :- nagyszuloje( Imre, N), write(n). A célsorozatot ismételten redukáljuk (lásd következő fólia), amíg csak write cél marad: [red. a (nsz) klózzal] :- szuloje( Imre, Sz), szuloje(sz, N), write(n). [red. a (sz1) klózzal] :- szuloje( István, N), write(n). [red. a (sz3) klózzal] :- write( Géza ). A futás eredményét a write argumentumából olvashatjuk ki. A példa érintett klózai és a célsorozat: szuloje( Imre, István ). (sz1) szuloje( István, Géza ). (sz3) nagyszuloje(gy, N) :- szuloje(gy, Sz), szuloje(sz, N). (nsz) :- nagyszuloje( Imre, N), write(n). Redukciós lépés: egy célsorozat + egy rá vonatkozó klóz új célsorozat. A redukciós lépést a vonatkozó predikátum minden klózára sorra megkiséreljük: A célsorozat első elemét a klóz fejével azos alakra hozzuk, változók behelyettesítésével. Mind a klózt, mind a célsorozatot specializáljuk a kívánt behelyettesítések elvégzésével. A példában előállítjuk (nsz) speciális esetét: nagyszuloje( Imre, N) :- szuloje( Imre, Sz), szuloje(sz, N). (nsz*) Az első célt helyettesítjük a klóz törzsével, azaz ezt a célt egy előfeltételére redukáljuk. A példában az új célsorozat: szuloje( Imre, Sz), szuloje(sz, N), write(n). A következő lépésben az (sz1) klózzal redukálunk, a célsorozatot specializálva az Sz = István behelyettesítéssel: szuloje( István, N), write(n). Mivel tényállítással redukálunk, üres törzset helyettesítünk, így a célsorozat hossza csökken. A (sz3) ténnyel való hasonló redukciós lépés eredménye: write( Géza ). Redukciós lépés további részletek LP-71 Választási pontok, visszalépés LP-72 Változók kezelése A változók hatásköre egy klózra terjed ki (vö. X 1... X j (F T )). A redukciós lépés előtt a klózt le kell másolni, a változókat szisztematikusan újakra cserélve (vö. rekurzió). Egyesítés: két kifejezés/állítás azos alakra hozása, változók behelyettesítésével. A változókat tetszőleges kifejezéssel lehet helyettesíteni, akár más változóval is. Az egyesítés a legáltalásabb közös alakot állítja elő. Pl. sum_tree(leaf(x), X) sum_tree(t, V) közös alakja sum_tree(leaf(x), X) és nem pl. sum_tree(leaf(0), 0) Az egyesítés eredménye a legáltalásabb közös alakot előállító behelyettesítés. Ez változó-átnevezéstől eltekintve egyértelmű. A példában: T=leaf(X), V=X. Példák: Hívás: Fej: Behelyettesítés: nagyszuloje( Imre, N) nagyszuloje(gy, NSz) Gy = Imre, NSz = N szuloje( Imre, Sz) szuloje( Imre, István ) Sz = István szuloje( Imre, Sz) szuloje( István, Géza ) nem egyesíthető szereti( István, Kit) szereti(x,x) X = István,Kit = István szereti(ki, Kit) szereti(x, X) X = Ki, Kit = Ki A példában szerencsénk volt, a redukciós lépések sorozata elvezetett egy megoldáshoz. Az általás esetben zsákutcába, egy nem redukálható célsorozathoz is juthatunk, pl. :- nagyszuloje( Imre, Civakodó Henrik ). (nsz) :- szuloje( Imre, Sz), szuloje(sz, Civakodó Henrik ). (sz1): szuloje( Imre, István ) :- szuloje( István, Civakodó Henrik ).??? A 2. célsorozatot az (sz1) klózzal redukáltuk, de a megoldáshoz az (sz2): szuloje( Imre, Gizella ) vezet nem csak az első egyesíthető klózfejet kell kezelnünk, hanem az összeset! Ha nem az utolsó klózzal redukálunk, akkor létrehozunk egy választási pontot, ebben elmentjük a célsorozatot és azt, hogy melyik klózzal redukáltuk. Zsákutca, vagy új megoldás kérése esetén visszatérünk a legutóbbi (legfiatalabb) választási ponthoz és ott a fennmaradó (még ki nem próbált) klózok között folytatjuk a keresést. Ha egy választási pontnál nem találunk újabb klózt, újabb visszalépés következik. Ha nincs választási pont ahova visszaléphetnénk, akkor a célsorozat futása meghiúsul. A fenti példában: visszatérünk a második lépéshez, és ott az (sz2) klózzal próbálkozunk: (...) :- szuloje( Imre, Sz), szuloje(sz, Civakodó Henrik ). (sz1) :- szuloje( Gizella, Civakodó Henrik ). (sz5)
19 Visszalépéses keresés szemléltetése keresési fával LP-73 A keresési tér bejárásának nyomkövetése LP-74. sz( Imre, István ). % (sz1) sz( Imre, Gizella ). % (sz2) sz( István, Géza ). % (sz3) sz( István, Sarolt ). % (sz4) sz( Gizella, CH ). % (sz5) sz( Gizella, BG ). % (sz6) nsz(gy, N) :- sz(gy, Sz), sz(sz, N). A keresési fa % (nsz) (sz1) Sz= István nsz( Imre, CH ) csomópontjai a végrehajtási állapotok címkék: sz( István, CH ) csomópontokban: célsorozatok, éleken: a kiválasztott klóz és a behelyettesítés. A Prolog keresés: a keresési fa bejárása balról jobbra, mélységi (depth-first) kereséssel. A szaggatott vonalak sikertelen klózkeresésre utalnak, az ún. első argumentum szerinti indexelés a felsőt kiküszöböli. (nsz) sz( Imre, Sz), sz(sz, CH ). (sz2) Sz= Gizella sz( Gizella, CH ) (sz5) Egy (szerkesztett) párbeszéd a redukciós nyomkövetővel, a meghiúsuló egyesítéseket elhagytuk.?- nagyszuloje( Imre, Civakodó Henrik ). G0: nagyszuloje( Imre, Civakodó Henrik )? <--- ujsor leütésére folytatja Trying clause 1 of nagyszuloje/2... successful (1) {Gyerek_1 = Imre, Nagyszulo_1 = Civakodó Henrik }<--- változó-átnevezés G1: szuloje( Imre,Szulo_1), szuloje(szulo_1, Civakodó Henrik )? Trying clause 1 of szuloje/2... successful (1) {Szulo_1 = István } -----G2: szuloje( István, Civakodó Henrik )? (...) <--- G3-G8 6 sikertelen klózillesztés <<<< Failing back to goal G1 <--- Van-e másik szuloje Imre -nek? Trying clause 2 of szuloje/2... successful (2) {Szulo_1 = Gizella } -----G9: szuloje( Gizella, Civakodó Henrik )? Trying clause 5 of szuloje/2... successful (5) {} -----G14: []? <--- üres klóz, siker ++++ Solution:? <<<< Failing back to goal G1 <--- az előző fólián alsó szaggatott <<<< No more choices <--- az előző fólián felső szaggatott Keresési fa újabb példa LP-75 Keresési fa még újabb példa LP-76 sz( Imre, István ). % (1) nsz(gy, N) :- sz( Imre, Gizella ). % (2) sz(gy, Sz), sz(sz, N). sz( István, Géza ). % (3) sz( István, Sarolt ).% (4) nsz( Imre, Nsz) sz( Gizella, CH ). % (5) sz( Gizella, BG ). % (6) sz( Imre, István ). % (1) nsz(gy, N) :- sz( Imre, Gizella ). % (2) sz(gy, Sz), sz(sz, N). sz( István, Géza ). % (3) sz( István, Sarolt ).% (4) nsz(u, BG ) sz( Gizella, CH ). % (5) sz( Gizella, BG ). % (6) sz( Imre, Sz), sz(sz, Nsz) sz(u, Sz), sz(sz, BG ) Sz = István (3) (1) sz( István, Nsz) (2) Sz = Gizella (4) (5) (6) sz( Gizella, Nsz) U = Imre Sz = István sz( István, BG ) (1) (2) (3)... (6) U = Imre Sz = Gizella sz( Gizella, BG ) Nsz = Géza Nsz = Sarolt Nsz = CH Nsz = BG (7)
20 A Prolog végrehajtás eljárásos modelljei LP-78 Az azos funktorú klózok alkotnak egy eljárást Egy eljárás meghívása a hívás és klózfej mintaillesztésével (egyesítésével) történik A végrehajtás lépéseinek modellezése: A PROLOG ELJÁRÁSOS MODELLJEI Eljárás-redukciós modell Lényegében ugyanaz mint a cél-redukciós modell. Az alaplépés: egy hívás-sorozat (azaz célsorozat) redukálása egy klóz segítségével (ez a már ismert redukciós lépés). Visszalépés: visszatérünk egy korábbi célsorozathoz, és újabb klózzal próbálkozunk. A modell előnyei: pontosan definiálható, a keresési tér szemléltethető Eljárás-doboz modell Az alapgondolat: egymásba skatulyázott eljárás-dobozok kapuin lépünk be és ki. Egy eljárás-doboz kapui: hívás (belépés), sikeres kilépés, sikertelen kilépés. Visszalépés: új megoldást kérünk egy már lefutott eljárástól (újra kapu). A modell előnyei: közel van a hagyományos rekurzív eljárásmodellhez, a Prolog beépített nyomkövetője is ezen alapul. LP-79 LP-80 A eljárás-redukciós végrehajtási modell A redukciós modell alapeleme: redukciós lépés A redukciós végrehajtási modell alapgondolata A végrehajtás egy állapota: egy célsorozat A végrehajtás kétféle lépésből áll: redukciós lépés: egy célsorozat + klóz új célsorozat zsákutca esetén visszalépés: visszatérés a legutolsó választási ponthoz Választási pont: létrehozása: olyan redukciós lépés amely nem a legutolsó klózzal illesztett aktiválása: visszalépéskor visszatérünk a választási pont célsorozatához és a további klózok között keresünk illeszthetőt (Emiatt a választási pontban a célsorozat mellett az illesztett klóz sorszámát is tárolni kell.) az ún. indexelés segít a választási pontok számának csökkentésében A redukciós modell keresési fával szemléltethető A végrehajtás során a fa csomópontjait járjuk be mélységi kereséssel A fa gyökerétől egy adott pontig terjedő szakaszon kell a választási pontokat megjegyezni ez a választási verem (choice point stack) Redukciós lépés: egy célsorozat redukálása egy újabb célsorozattá egy programklóz segítségével (az első cél felhasználói eljárást hív): A klózt lemásoljuk, minden változót szisztematikusan új változóra cserélve. A célsorozatot szétbontjuk az első hívásra és a maradékra. Az első hívást egyesítjük a klózfejjel A szükséges behelyettesítéseket elvégezzük a klóz törzsén és a célsorozat maradékán is Az új célsorozat: a klóztörzs és utána a maradék célsorozat Ha a hívás és a klózfej nem egyesíthető, akkor a redukciós lépés meghiúsul. egy beépített eljárás segítségével (az első cél beépített eljárást hív): A célsorozatot szétbontjuk az első hívásra és a maradékra. A beépített eljáráshívást végrehajtjuk. Ez lehet sikeres (változó-behelyettesítésekkel), vagy lehet sikertelen. Siker esetén a behelyettesítéseket elvégezzük a célsorozat maradékán. Az új célsorozat: az (első hívás elhagyása után fennmaradó) maradék célsorozat. Ha a beépített eljárás hívása sikertelen, akkor a redukciós lépés meghiúsul.
Deklaratív programozás KÖVETELMÉNYEK, TUDNIVALÓK. Deklaratív programozás: tudnivalók. Deklaratív programozás: tudnivalók (folyt.)
DP-1 Deklaratív programozás Hanák Péter hanak@inf.bme.hu Irányítástechnika és Informatika Tanszék KÖVETELMÉNYEK, TUDNIVALÓK Szeredi Péter szeredi@cs.bme.hu Számítástudományi és Információelméleti Tanszék
Deklaratív programozás
Deklaratív programozás Hanák Péter 1 Szeredi Péter 2 1 hanak@iit.bme.hu BME Irányítástechnika és Informatika Tanszék 2 szeredi@cs.bme.hu BME Számítástudományi és Információelméleti Tanszék 2008. őszi félév
Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }
Funkcionális és logikai programozás { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem } http://www.ms.sapientia.ro/~mgyongyi ` 1 Jelenlét: Követelmények, osztályozás Az első 4 előadáson
FUNKCIONÁLIS PROGRAMOZÁS
FUNKCIONÁLIS PROGRAMOZÁS A funkcionális programozás néhány jellemzője Funkcionális programozás 1-2 Funkcionális, más néven applikatív programozás Funkcionális = függvényalapú, függvényközpontú Applikatív
Operátorok: zárójelezés
Operátorok: zárójelezés LP-53 Induljunk ki egy teljesen zárójelezett, több operátort tartalmazó kifejezésből! Egy részkifejezés prioritása a (legkülső) operátorának a prioritása. Egy op prioritású operátor
Logikai programozás ADMINISZTRATÍV KÉRDÉSEK KÖVETELMÉNYRENDSZER FŐBB PONTOK NÉHÁNY BIZTATÓ SZÓ
Logikai programozás ADMINISZTRATÍV KÉRDÉSEK Bármilyen kérdéssel (akár tananyag, akár nem), örömmel, bánattal: achs.agnes@gmail.com (Ha két napon belül nem válaszolok, akkor kérek egy figyelmeztető levelet.
III. rész. Prolog alapok. Programozási nyelvek osztályozása. A logikai programozás alapgondolata. Deklaratív programozási nyelvek
III. rész Programozási nyelvek osztályozása Programozási nyelvek stílusok 1 Bevezetés Imperatív Deklaratív 2 Cékla: deklaratív programozás C++-ban 3 4 Erlang alapok 5 Haladó Prolog Fortran Algol C C++...
I. rész. A Prolog programozási nyelv. Tanítsuk gondolkodni a gépet. SugóParti TudósParty
Tanítsuk gondolkodni a gépet avagy hogyan nyert a számítógép a "Mindent vagy semmit" vetélkedő amerikai változatában Szeredi Péter I. rész szeredi@cs.bme.hu BME Számítástudományi és Információelméleti
Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók
Haskell 1. Alapok tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók elég jól elkerülhetők így a mellékhatások könnyebben
II. rész. Cékla: deklaratív programozás C++-ban. Tartalom. Imperatív és deklaratív programozási nyelvek. A deklaratív programozás jelmondata
II. rész 1 Bevezetés 2 3 Prolog alapok 2 4 Erlang alapok 5 Haladó Prolog 6 Haladó Erlang A deklaratív programozás jelmondata MIT és nem HOGYAN (WHAT rather than HOW): a megoldás módja helyett inkább a
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezés versus utasítás C/C++: kifejezés plusz pontosvessző: utasítás kiértékeli a kifejezést jellemzően: mellékhatása is van például: értékadás Ada: n = 5;
Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat
Formális nyelvek a gyakorlatban Formális nyelvek, 1 gyakorlat Segédanyagok Célja: A programozási nyelvek szintaxisának leírására használatos eszközök, módszerek bemutatása Fogalmak: BNF, szabály, levezethető,
Budapest, 2004. február
BUDAPESTI M ŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR DEKLARATÍV PROGRAMOZÁS OKTATÁSI SEGÉDLET Bevezetés a logikai programozásba Szeredi Péter szeredi@cs.bme.hu Számítástudományi
Logika es sz am ıt aselm elet I. r esz Logika 1/36
1/36 Logika és számításelmélet I. rész Logika 2/36 Elérhetőségek Tejfel Máté Déli épület, 2.606 matej@inf.elte.hu http://matej.web.elte.hu Tankönyv 3/36 Tartalom 4/36 Bevezető fogalmak Ítéletlogika Ítéletlogika
C programozás. 1 óra Bevezetés
C programozás 1 óra Bevezetés A C nyelv eredete, fő tulajdonságai 1. Bevezető C nyelv alapelemei többsége a BCPL (Basic Combined Programming Language {1963}) Martin Richards B nyelv Ken Thompson {1970}
BASH script programozás II. Vezérlési szerkezetek
06 BASH script programozás II. Vezérlési szerkezetek Emlékeztető Jelölésbeli különbség van parancs végrehajtása és a parancs kimenetére való hivatkozás között PARANCS $(PARANCS) Jelölésbeli különbség van
I. rész Bevezetés. Deklaratív Programozás. A tárgy témája. Tartalom. Szeredi Péter 1 Hanák Péter ősz
Deklaratív Programozás Szeredi Péter 1 Hanák Péter 2 1 szeredi@cs.bme.hu BME Számítástudományi és Információelméleti Tanszék 2 hanak@emt.bme.hu BME Egészségipari Mérnöki Tudásközpont I. rész Bevezetés
Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból
ÜTEMTERV Programozás-elmélet c. tárgyhoz (GEMAK233B, GEMAK233-B) BSc gazdaságinformatikus, programtervező informatikus alapszakok számára Óraszám: heti 2+0, (aláírás+kollokvium, 3 kredit) 2019/20-es tanév
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezések Lexika Szintaktika Szemantika Lexika azonosítók (változó-, metódus-, típus- és csomagnevek) literálok operátorok, pl. + zárójelek: (), [], {},
Szoftvertervezés és -fejlesztés I.
Szoftvertervezés és -fejlesztés I. Operátorok Vezérlési szerkezetek Gyakorlás 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik.
2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1
2. Rekurzió Egy objektum definícióját rekurzívnak nevezünk, ha a definíció tartalmazza a definiálandó objektumot. Egy P eljárást (vagy függvényt) rekurzívnak nevezünk, ha P utasításrészében előfordul magának
Java II. I A Java programozási nyelv alapelemei
Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak
Programok értelmezése
Programok értelmezése Kód visszafejtés. Izsó Tamás 2016. szeptember 22. Izsó Tamás Programok értelmezése/ 1 Section 1 Programok értelmezése Izsó Tamás Programok értelmezése/ 2 programok szemantika értelmezése
Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.10.. -1- Mit tudunk már? Típus fogalma char, int, float,
Programozás nyelvek a közoktatásban 1. előadás
Programozás nyelvek a közoktatásban 1. előadás Alapelve Prolog Programozás a matematikai logika segítségével Egy logikai program logikai állítások halmaza Egy logikai program futása egy következtetési
Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Mit tudunk már? Típus fogalma char, int, float, double változók deklarációja operátorok (aritmetikai, relációs, logikai,
sallang avagy Fordítótervezés dióhéjban Sallai Gyula
sallang avagy Fordítótervezés dióhéjban Sallai Gyula Az előadás egy kis példaprogramon keresztül mutatja be fordítók belső lelki világát De mit is jelent, az hogy fordítóprogram? Mit csinál egy fordító?
Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!
A PL/SQL alapelemei Karakterkészlet Az angol ABC kis- és nagybetűi: a-z, A-Z Számjegyek: 0-9 Egyéb karakterek: ( ) + - * / < > =! ~ ^ ; :. ' @ %, " # $ & _ { }? [ ] Szóköz, tabulátor, kocsivissza A kis-
Logika és informatikai alkalmazásai kiskérdések február Mikor mondjuk, hogy az F formula a G-nek részformulája?
,,Alap kiskérdések Logika és informatikai alkalmazásai kiskérdések 2012. február 19. 1. Hogy hívjuk a 0 aritású függvényjeleket? 2. Definiálja a termek halmazát. 3. Definiálja a formulák halmazát. 4. Definiálja,
Deklaratív Programozás
Deklaratív Programozás Szeredi Péter 1 Kápolnai Richárd 2 1 szeredi@cs.bme.hu BME Számítástudományi és Információelméleti Tanszék 2 kapolnai@iit.bme.hu BME Irányítástechnika és Informatika Tanszék 2015
Komputeralgebra rendszerek
Komputeralgebra rendszerek III. Változók Czirbusz Sándor czirbusz@gmail.com Komputeralgebra Tanszék ELTE Informatika Kar 2009-2010 ősz Index I 1 Szimbolikus konstansok kezelés A konstansok Nevek levédése
Komputeralgebra rendszerek
Komputeralgebra rendszerek III. Változók Czirbusz Sándor czirbusz@gmail.com Komputeralgebra Tanszék ELTE Informatika Kar 2009-2010 ősz Index I 1 Szimbolikus konstansok kezelés A konstansok Nevek levédése
A programozás alapjai
A programozás alapjai Változók A számítógép az adatokat változókban tárolja A változókat alfanumerikus karakterlánc jelöli. A változóhoz tartozó adat tipikusan a számítógép memóriájában tárolódik, szekvenciálisan,
ÍTÉLETKALKULUS (NULLADRENDŰ LOGIKA)
ÍTÉLETKALKULUS SZINTAXIS ÍTÉLETKALKULUS (NULLADRENDŰ LOGIKA) jelkészlet elválasztó jelek: ( ) logikai műveleti jelek: ítéletváltozók (logikai változók): p, q, r,... ítéletkonstansok: T, F szintaxis szabályai
Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe
Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével
Komputeralgebra Rendszerek
Komputeralgebra Rendszerek Konstansok, változók, típusok Czirbusz Sándor ELTE IK, Komputeralgebra Tanszék 2015. február 24. TARTALOMJEGYZÉK 1 of 110 TARTALOMJEGYZÉK I 1 TARTALOMJEGYZÉK 2 Nevek kezelése
2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér
Funkcionális programozás 2. el adás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2019, tavaszi félév Mir l volt szó? Követelmények, osztályozás Programozási
Rekurzió. Dr. Iványi Péter
Rekurzió Dr. Iványi Péter 1 Függvényhívás void f3(int a3) { printf( %d,a3); } void f2(int a2) { f3(a2); a2 = (a2+1); } void f1() { int a1 = 1; int b1; b1 = f2(a1); } 2 Függvényhívás void f3(int a3) { printf(
1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon
1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (
A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.
Függvények 1.Függvények...1 1.1.A függvény deníció szintaxisa... 1..Függvények érték visszatérítése...3 1.3.Környezettel kapcsolatos kérdések...4 1.4.Lokális változók használata...4 1.5.Rekurzív hívások...5.kód
Aritmetikai kifejezések lengyelformára hozása
Aritmetikai kifejezések lengyelformára hozása Készítették: Santák Csaba és Kovács Péter, 2005 ELTE IK programtervező matematikus szak Aritmetikai kifejezések kiértékelése - Gyakran felmerülő programozási
A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai
A programozás alapjai 1 1. előadás Híradástechnikai Tanszék Amiről szólesz: A tárgy címe: A programozás alapjai A számítógép részegységei, alacsony- és magasszintű programnyelvek, az imperatív programozási
7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.
7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II. A gyakorlat célja: 1. A shell vezérlő szerkezetei használatának gyakorlása. A használt vezérlő szerkezetek: if/else/fi, for, while while, select, case,
Occam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
Algoritmizálás + kódolás C++ nyelven és Pascalban
Algoritmizálás + kódolás nyelven és ban Motiváció A Programozási alapismeretek tárgyban az algoritmizáláshoz struktogramot, a kódoláshoz nyelvet használunk, a Közismereti informatikában (a közoktatásban
Algoritmizálás, adatmodellezés tanítása 6. előadás
Algoritmizálás, adatmodellezés tanítása 6. előadás Tesztelési módszerek statikus tesztelés kódellenőrzés szintaktikus ellenőrzés szemantikus ellenőrzés dinamikus tesztelés fekete doboz módszerek fehér
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
Elsőrendű logika. Mesterséges intelligencia március 28.
Elsőrendű logika Mesterséges intelligencia 2014. március 28. Bevezetés Ítéletkalkulus: deklaratív nyelv (mondatok és lehetséges világok közti igazságrelációk) Részinformációkat is kezel (diszjunkció, negáció)
Java II. I A Java programozási nyelv alapelemei
Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba
Hibaforrások Hiba A feladatok megoldása során különféle hibaforrásokkal találkozunk: Modellhiba, amikor a valóságnak egy közelítését használjuk a feladat matematikai alakjának felírásához. (Pl. egy fizikai
S z á m í t ó g é p e s a l a p i s m e r e t e k
S z á m í t ó g é p e s a l a p i s m e r e t e k 7. előadás Ami eddig volt Számítógépek architektúrája Alapvető alkotóelemek Hardver elemek Szoftver Gépi kódtól az operációs rendszerig Unix alapok Ami
Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás 4.11. A C előfeldolgozó rendszer A fordítás első lépése a C esetében a különböző nyelvi kiterjesztések feldolgozása: másik állomány tartalmának
Absztrakt adatstruktúrák A bináris fák
ciós lámpa a legnagyobb élettartamú és a legjobb hatásfokú fényforrásnak tekinthető, nyugodtan mondhatjuk, hogy a jövő fényforrása. Ezt bizonyítja az a tény, hogy ezen a területen a kutatások és a bejelentett
Szkriptnyelvek. 1. UNIX shell
Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek
2018, Diszkrét matematika
Diszkrét matematika 3. előadás mgyongyi@ms.sapientia.ro Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia 2018, őszi félév Miről volt szó az elmúlt előadáson? számtartományok: természetes
Felvételi vizsga mintatételsor Informatika írásbeli vizsga
BABEȘ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR A. tételsor (30 pont) Felvételi vizsga mintatételsor Informatika írásbeli vizsga 1. (5p) Egy x biten tárolt egész adattípus (x szigorúan pozitív
I. rész. Bevezetés. Deklaratív Programozás. A tárgy témája. Tartalom. Szeredi Péter 1 Kápolnai Richárd ősz
I. rész Deklaratív Programozás Bevezetés Szeredi Péter 1 Kápolnai Richárd 2 1 szeredi@cs.bme.hu BME Számítástudományi és Információelméleti Tanszék 1 Bevezetés 2 Cékla: deklaratív programozás C++-ban 2
Programozási nyelvek a közoktatásban alapfogalmak I. előadás
Programozási nyelvek a közoktatásban alapfogalmak I. előadás Szempontok Programozási nyelvek osztályozása Felhasználói kör (amatőr, professzionális) Emberközelség (gépi nyelvektől a természetes nyelvekig)
Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása
Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző
Programozási nyelvek 6. előadás
Programozási nyelvek 6. előadás Szempontok Programozási nyelvek osztályozása Felhasználói kör (amatőr, professzionális) Emberközelség (gépi nyelvektől a természetes nyelvekig) Számítási modell (hogyan
Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED
UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED AWK - szintaxis, vezérlési szerkezetek Operációs rendszerek 11. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik
Formális szemantika. Kifejezések szemantikája. Horpácsi Dániel ELTE Informatikai Kar
Formális szemantika Kifejezések szemantikája Horpácsi Dániel ELTE Informatikai Kar 2016-2017-2 Az előadás témája Egyszerű kifejezések formális szemantikája Az első lépés a programozási nyelvek szemantikájának
Java programozási nyelv
Java programozási nyelv 2. rész Vezérlő szerkezetek Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember A Java programozási nyelv Soós Sándor 1/23 Tartalomjegyzék
Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás A tárgy órái Előadás hetente (St101) csüt. 8:15 Bécsi Tamás C elmélet Ajánlott irodalom Dennis Ritchie: A C programozási nyelv Gyakorlat hetente
Elsőrendű logika szintaktikája és szemantikája. Logika (3. gyakorlat) 0-adrendű szemantika 2009/10 II. félév 1 / 1
Elsőrendű logika szintaktikája és szemantikája Logika és számításelmélet, 3. gyakorlat 2009/10 II. félév Logika (3. gyakorlat) 0-adrendű szemantika 2009/10 II. félév 1 / 1 Az elsőrendű logika Elemek egy
Predikátumkalkulus. 1. Bevezet. 2. Predikátumkalkulus, formalizálás. Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák.
Predikátumkalkulus Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák. 1. Bevezet Nézzük meg a következ két kijelentést: Minden almához tartozik egy fa, amir l leesett. Bármely
Programozás alapjai. 5. előadás
5. előadás Wagner György Általános Informatikai Tanszék Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk
Deklaratív Programozás
Deklaratív Programozás Szeredi Péter 1 Kápolnai Richárd 2 1 szeredi@cs.bme.hu BME Számítástudományi és Információelméleti Tanszék 2 kapolnai@iit.bme.hu BME Irányítástechnika és Informatika Tanszék 2012
ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK
ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK 1. ELÁGAZÁSOK ÉS CIKLUSOK SZERVEZÉSE Az adatszerkezetek mellett a programok másik alapvető fontosságú építőkövei az ún. algoritmikus szerkezetek.
Automaták és formális nyelvek
Automaták és formális nyelvek Bevezetés a számítástudomány alapjaiba 1. Formális nyelvek 2006.11.13. 1 Automaták és formális nyelvek - bevezetés Automaták elmélete: információs gépek általános absztrakt
Logika és informatikai alkalmazásai
Logika és informatikai alkalmazásai 9. gyakorlat Németh L. Zoltán http://www.inf.u-szeged.hu/~zlnemeth SZTE, Informatikai Tanszékcsoport 2008 tavasz Egy HF múlt hétről HF1. a) Egyesíthető: s = [y/f(x,
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Az Integrált Fejlesztői Környezet C++ alapok Az Integrált Fejlesztői Környezet Visual Studio 2013 Community Edition Kitekintés: fordítás Preprocesszor Fordító
Hardver leíró nyelvek (HDL)
Hardver leíró nyelvek (HDL) Benesóczky Zoltán 2004 A jegyzetet a szerzıi jog védi. Azt a BME hallgatói használhatják, nyomtathatják tanulás céljából. Minden egyéb felhasználáshoz a szerzı belegyezése szükséges.
2018, Funkcionális programozás
Funkcionális programozás 6. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? Haskell modulok, kompilálás a
... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)
6. Fabejáró algoritmusok Fa bejárásán olyan algoritmust értünk, amelynek bemenete egy F fa és egy M művelet, és az algoritmus adott sorrendben pontosan egyszer végrehajtja az M műveletet a fa pontjaiban
Ítéletkalkulus. 1. Bevezet. 2. Ítéletkalkulus
Ítéletkalkulus Logikai alapfogalmak, m veletek, formalizálás, logikai ekvivalencia, teljes diszjunktív normálforma, tautológia. 1. Bevezet A matematikai logikában az állításoknak nem a tényleges jelentésével,
C programozási nyelv
C programozási nyelv Előfeldolgozó utasítások Dr Schuster György 2011 május 3 Dr Schuster György () C programozási nyelv Előfeldolgozó utasítások 2011 május 3 1 / 15 A fordítás menete Dr Schuster György
Bevezetés az informatikába
Bevezetés az informatikába 6. előadás Dr. Istenes Zoltán Eötvös Loránd Tudományegyetem Informatikai Kar Programozáselmélet és Szoftvertechnológiai Tanszék Matematikus BSc - I. félév / 2008 / Budapest Dr.
5. előadás. Programozás-elmélet. Programozás-elmélet 5. előadás
Elemi programok Definíció Az S A A program elemi, ha a A : S(a) { a, a, a, a,..., a, b b a}. A definíció alapján könnyen látható, hogy egy elemi program tényleg program. Speciális elemi programok a kövekezők:
Intermec EasyCoder PM4i nyomtató programozásának alapjai Intermec Fingerprint v8.00 nyelven
Intermec EasyCoder PM4i nyomtató programozásának alapjai Intermec Fingerprint v8.00 nyelven Bevezető Basic-szerű, nyomtatóra szánt programozási nyelv, melyet az Intermec Technologies fejlesztett ki számítógép
HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport
10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)
Modellellenőrzés. dr. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék
Modellellenőrzés dr. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék 1 Mit szeretnénk elérni? Informális vagy félformális tervek Informális követelmények Formális modell: KS, LTS, TA
3 A C programozási nyelv szintaktikai egységei
3 A C programozási nyelv szintaktikai egységei 3.1 Azonosítók Betűk és számjegyek sorozata, betűvel vagy _ (aláhúzás) karakterrel kell kezdődnie. A nagy- és kisbetűk különbözőek. Az azonosítók tetszőleges
Matematikai logika és halmazelmélet
Matematikai logika és halmazelmélet Wettl Ferenc előadása alapján 2015-09-07 Wettl Ferenc előadása alapján Matematikai logika és halmazelmélet 2015-09-07 1 / 21 Tartalom 1 Matematikai kijelentések szerkezete
Készítette: Nagy Tibor István
Készítette: Nagy Tibor István Operátorok Műveletek Egy (vagy több) műveleti jellel írhatók le A műveletet operandusaikkal végzik Operátorok fajtái operandusok száma szerint: egyoperandusú operátorok (pl.:
Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás
Kódgenerálás Memóriagazdálkodás Kódgenerálás program prológus és epilógus értékadások fordítása kifejezések fordítása vezérlési szerkezetek fordítása Kódoptimalizálás L ATG E > TE' E' > + @StPushAX T @StPopBX
Logika es sz am ıt aselm elet I. r esz Logika Harmadik el oad as 1/33
1/33 Logika és számításelmélet I. rész Logika Harmadik előadás Tartalom 2/33 Elsőrendű logika bevezetés Az elsőrendű logika szintaxisa 3/33 Nulladrendű állítás Az ítéletlogikában nem foglalkoztunk az álĺıtások
Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1
Fordító részei Kód visszafejtés. Izsó Tamás 2016. szeptember 29. Izsó Tamás Fordító részei / 1 Section 1 Fordító részei Izsó Tamás Fordító részei / 2 Irodalom Izsó Tamás Fordító részei / 3 Irodalom Izsó
Predikátumkalkulus. Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák. Vizsgáljuk meg a következ két kijelentést.
Predikátumkalkulus Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák. 1. Bevezet Vizsgáljuk meg a következ két kijelentést. Minden almához tartozik egy fa, amir l leesett.
2. Ítéletkalkulus szintaxisa
2. Ítéletkalkulus szintaxisa (4.1) 2.1 Az ítéletlogika abc-je: V 0 V 0 A következő szimbólumokat tartalmazza: ítélet- vagy állításváltozók (az állítások szimbolizálására). Esetenként logikai változónak
Programozási nyelvek (ADA)
Programozási nyelvek (ADA) Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 1. előadás Hasznos weboldal http://kto.web.elte.hu Program felépítése Programegységek (program unit) eljárások (procedure)
Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek
Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő
BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga
BABEȘ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR A. tételsor (30 pont) 1. (5p) Tekintsük a következő alprogramot: Alprogram f(a): Ha a!= 0, akkor visszatérít: a + f(a - 1) különben visszatérít
Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás
Programozás BMEKOKAA146 Dr. Bécsi Tamás 2. előadás Szintaktikai alapok Alapvető típusok, ismétlés C# típus.net típus Méret (byte) Leírás byte System.Byte 1Előjel nélküli 8 bites egész szám (0..255) char
Logika és informatikai alkalmazásai
Logika és informatikai alkalmazásai 4. gyakorlat Németh L. Zoltán http://www.inf.u-szeged.hu/~zlnemeth SZTE, Informatikai Tanszékcsoport 2011 tavasz Irodalom Szükséges elmélet a mai gyakorlathoz Előadás
BASH SCRIPT SHELL JEGYZETEK
BASH SCRIPT SHELL JEGYZETEK 1 TARTALOM Paraméterek... 4 Változók... 4 Környezeti változók... 4 Szűrők... 4 grep... 4 sed... 5 cut... 5 head, tail... 5 Reguláris kifejezések... 6 *... 6 +... 6?... 6 {m,n}...
Oktatási segédlet 2014
Oktatási segédlet 2014 A kutatás a TÁMOP 4.2.4.A/2-11-1-2012- 0001 azonosító számú Nemzeti Kiválóság Program Hazai hallgatói, illetve kutatói személyi támogatást biztosító rendszer kidolgozása és működtetése
... S n. A párhuzamos programszerkezet két vagy több folyamatot tartalmaz, melyek egymással közös változó segítségével kommunikálnak.
Párhuzamos programok Legyen S parbegin S 1... S n parend; program. A párhuzamos programszerkezet két vagy több folyamatot tartalmaz, melyek egymással közös változó segítségével kommunikálnak. Folyamat