Obsah 1 vod 3 2 Prolog vod : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Charakteristika : : : : : : : :

Save this PDF as:
 WORD  PNG  TXT  JPG

Størrelse: px
Begynne med side:

Download "Obsah 1 vod 3 2 Prolog vod : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Charakteristika : : : : : : : :"

Transkript

1 ECL i PS e popis syst mu c Milan Schmotzer Katedra Kybernetiky a Umelej Inteligencie Fakulta Elektrotechniky a Informatiky Technick Univerzita Ko ice Letn 9, Ko ice, Slovak Republic 21. marca 1997

2 Obsah 1 vod 3 2 Prolog vod : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Charakteristika : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Zozn menie : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Fakty : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Pravidl : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Nevyhnutn znalosti program tora v Prologu : : : : : : : : : : : : : : : : : : Modik cia datab zy Prologu : : : : : : : : : : : : : : : : : : : : : : Cykly : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Rekurzia : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Syntax : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Den cia vstavan ch predik tov : : : : : : : : : : : : : : : : : : : : : Zoznamy : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 21 3 ECL i PS e vod : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Roz renia : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Spustenie syst mu : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Kompil cia : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Dynamick versus statick predik ty : : : : : : : : : : : : : : : : : : : : : : Kni nice : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Paraleln vykon vanie programu : : : : : : : : : : : : : : : : : : : : : : : : : Aritmetick predik ty : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Numerick typy a konverzie medzi nimi : : : : : : : : : : : : : : : : : Preddenovan aritmetick predik ty : : : : : : : : : : : : : : : : : : Pou vate om denovan aritmetick predik ty : : : : : : : : : : : : : Glob lne premenn a polia : : : : : : : : : : : : : : : : : : : : : : : : : : : : Glob lne referencie : : : : : : : : : : : : : : : : : : : : : : : : : : : : Vstupy a v stupy : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Debugger : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Proler a tatistika : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Usp vanie cie ov : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 38 1

3 2 OBSAH 4 Roz renia syst mu ECL i PS e vod : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Usp vanie cie ov : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Kni nica kone n ch dom n : : : : : : : : : : : : : : : : : : : : : : : : : : : : Predik ty pre kompatibilitu so syst mom CHIP : : : : : : : : : : : : 46

4 Kapitola 1 vod Programovac jazyk Prolog je predstavite om logick ho programovania. V roku 1981 bol vybran za strojov jazyk po ta ov 5. gener cie, preto e je vhodn hlavne na rie enie loh umelej inteligencie. Existuje mno stvo verzi jazyka Prolog vyv jan ch r znymi rmami a univerzitami. Len pre po ta e triedy PC vznikol LPA Prolog Professional, Arity Prolog rmy ARITY COR- PORATION, Turbo Prolog rmy Borland International 1 a in implement cie. Niektor z nich v razne vylep uj tandardn Prolog 2. Jedn m z tak chto vy ch Prologov jeecl i PS e3. 1 Firma Borland International, Inc. v ak preklada Turbo Prologu po ase prestala dod va. V jeho v voji pokra uje americk spolo nos Prolog Development Center, ktor jeho roz ren verziu pred va pod n zvom PDC Prolog. 2 Prolog nikdy nebol plne tandardizovan, ale neoci lne sa za tandard pova uje jeho prv implement cia Edinburgh Prolog. 3 Pri v bere n zvov produktov riem sa ako skratky asto pou vaj slov existuj ce v anglickom slovn ku. Tak aj ECL i PS e = ECRC Common Logic Programming System v preklade do sloven iny znamen ZAT m EN ie. 3

5 4 KAPITOLA 1. VOD

6 Kapitola 2 Prolog 2.1 vod Assembler je programovac jazyk, ktor program torovi umo uje nestara sa o k dy prira- ovan jednotliv m in trukci m univerz lneho procesora a v razne mu t m u ah uje pr cu. Vy ou rov ou programovania, ne je programovanie v assembleri, je programovanie v klasick ch procedur lnych jazykoch FORTRAN, PASCAL i C. Tieto jazyky s ve mi ob ben, preto e umo uj portabilitu { prenosite nos programov medzi po ta mi r znych architekt r s procesormi s r znymi in truk n mi sadami. Prenosite nos programov je mo n na rovni zdrojov ch textov. Preklada e t chto jazykov umo uj abstrahova od in trukci konkr tneho procesora a z h adiska program tora univerz lny procesor emuluje virtu lny procesor 1, ktor rozumie dan mu jazyku. E te pred vznikom prv ho po ta a Turing predpovedal in mo nos interpret cie sel ulo en ch v pam ti po ta a. Jednotliv m slam je mo n priradi jednotliv znaky abecedy. Tak vznikli tabu ky znakov a len v aka nim dnes komunikujeme s po ta om pomocou slovn ch (nie seln ch ) pr kazov. selne ulo en inform cia sa tak stala univerz lnou. Umo uje zaznamena ak ko vek daj sla, texty, obr zky, programy at. T m, e po ta m e interpretova seln inform ciu r znymi sp sobmi, otvorila sa cesta umelej inteligencii.akchceme napodobni innos udsk ho mozgu, mali by sme pou i neur nov siete,av ak ani z aleka nie sme schopn vytvori tak ohromn sie neur nov. Sme n ten vych dza z existuj cej technol gie, hoci u samotn princ py architekt r dne n ch po ta ov s pre n s v nym obmedzen m. Ak za z kladn vlastnosti inteligencie budeme pova ova adapt vnos, schopnos u i sa a kreativitu, je jasn, e inteligentn stroj nevysta s dopredu denovan mi innos- ami. Potrebuje by kreat vny, potrebuje ma schopnos meni program svojej innosti.pr ve schopnos u i sa nielen fakty ale aj algoritmy a prisp sobova svoje algoritmy nov m podmienkam je ve mi a ko implementovate n. Mno stvo program torov cel ho sveta sa preto nesna vytvori inteligentn bytos, ale kladie si skromnej cie : aspo ako takvyrie i len jeden konkr tny probl m. 1 asto nespr vne ozna ovan ako virtu lny po ta 5

7 6 KAPITOLA 2. PROLOG Pred nieko k mi desiatkami rokov vznikol program torsk jazyk Lisp. V umelej inteligencii sa asto ozna uje akoassembler umelej inteligencie. Probl my umelej inteligencie sa v om programuj neporovnate ne ah ie ako v klasick ch jazykoch typu C, preto e premenn tu m e zastupova ubovo n objekt. Tento objekt nie je dopredu deklarovan, m e n m by dokonca zoznam popisuj ci innos algoritmus. Ke e programy nap san v Lispe sprac va interpreter, ktor sa chov ako virtu lny procesor rozumej ci syntaxi Lispu, je mo n po as innosti ( behu ) programu vytv ra r zne premenn obsahuj ce nielen daje, ale aj program je teda mo n samomodik cia programu, o je pre umel inteligenciu d le it. Automatick zmena programu na rovni ni ch jazykov by principi lne tie bola mo n. Bola by v ak pr li n ro n a teda z h adiska toho, ko ko asu by nad ou str vil program tor, neefekt vna. Av ak robia sa aj pokusy na tejto rovni. Ako pr klad n m m e posl i programov syst m Tierra vyu vaj ci ak si pseudoassembler, ktor v spojen s genetick mi algoritmami d va v oblasti dynamickej zmeny programu pozoruhodn v sledky. Zatia s ce sl i len ako syst m na simul ciu ivej pr rody, osobne v ak podobn m syst mom d vam ve k ance v oblasti umelej inteligencie 2. Lisp v klasickej forme je v ak st le procedur lny jazyk. In pr stup k programovaniu umo uj deklarat vne jazyky, v ktor ch je interpreter pracuj ci nad datab zou dajov schopn vykon va jednoduch syntaktick ( nie s mantick ) inferenciu. lohou program tora potom u nie je vytv ranie programu ako odpovede na ot zku ako nie o naprogramova, ale vytv ranie datab zy dajov, teda sk r zodpovedanie ot zky o naprogramova. Prolog 3 je deklarat vny jazyk Charakteristika Program nap san v jazyku C sa prelo do strojov ho k du a alej je u nemenn. Naproti tomu jazyky umelej inteligencie umo uj pomocou r znych mechanizmov meni vlastn program. Lisp t to zmenuumo uje na z klade zmeny obsahu premenn ch aichinterpret cie ako programov, Prolog umo uje zmenu innosti programu modik ciou svojich datab z. Prolog je pomerne siln program torsk jazyk, ktor m v sebe zabudovan inferen n mechanizmus. Je predstavite om logick ho programovania. Umo uje pou va as logiky prv ho r du ( logiku Hornov ch klauz l ). 2.3 Zozn menie Fakty Spustime interpreter Prologu a op tajme sa ho: [1]> 4 > 3. 2 Dokonca aj keby nebol schopn rie i probl my umelej inteligencie ani v bud cnosti, je to neocenite n prostriedok nielen pre biol gov, preto e je to jeden z m la z lovekom vytvoren ch syst movschopn evol cie. 3 PROgramming in LOGic = programovanie pomocou logiky. 4 Dnes u existuj roz renia Lispu so zabudovan m inferen n m mechanizmom.

8 2.3. ZOZN MENIE 7 [2]> Prompt [1]> je kt vny prompt, ktor u ka d ho interpretra vyzer in. Je to v zva interpretra Prologu aby sme mu zadali ot zku. Pr ca so syst mom Prolog je vlastne dial g medzi pou vate om a syst mom. Interpretru sme ot zku zadali vetou 4 > 3. Vlastne sme mu osi ozn mili a on sa pok si zisti, i je zadan veta pravdiv. Ke e v rok 4 > 3 je pravdiv, odpovedal, o znamen no, tyri je viac ako tri. Op tajme sa ho, i pr. [2]> prsi. no [3]> Interpreter Prologu m zabudovan ur it v dy platn v roky, napr klad 4 je v dy viac ako 3. Pre odpove na ot zku, i pr, to v ak nesta. Jedin mo nos, ako zisti, i pr, je vyh ada t to inform ciu v datab ze. Do datab zy ju m e ulo i napr klad nejak in program, ktor sa ju m e dozvedie priamym pozorovan m pomocou idiel, od loveka, a podobne. Zap me teda Prologu do datab zy inform ciu o tom, e pr. ia, ka d syst m m svoju met du z pisu nov ch predik tov ( v rokov ). Povedzme, e n syst m je schopn zap sa predik ty do datab zy takto: [3]> [user]. prsi. ^D [4]> prsi. [5]> Pr kaz [user] prepol interpreter do stavu na tania vstupu do datab zy priamo od pou vate a (zo tandardn ho vstupu ). Nap sal som prsi., nov riadok ( stla il som kl vesu ENTER ) a kombin ciu kl ves Ctrl-D. T to kombin cia kl ves v opera nom syst me UNIX symbolizuje koniec s boru ainterpreter Prologu sa op prepne do pr kazov ho re imu. Na ot zku prsi. u Prolog odpovie. Ot zku pochopil ako cie, ktor m splni, to jest zisti, i je mo n odvodi ho z datab zy. To nebol probl m, preto e tam na iel predik t prsi. Ak by ho tam nena iel, odpovedal by no, o by znamenalo, e nevie, i pr. To je nepr jemn, o ak program tor na nie o zabudne a odpove interpretra jazyka Prolog no

9 8 KAPITOLA 2. PROLOG bude znamena, e sa ot zka z datab zy dajov odvodi ned a my to pochop me ako odpove, e zadan v rok neplat? Odpove no v ak m e by aj spr vna ak sa z datab zy odvod, e dan v rok ot zka neplat. Je preto dobrou snahou program torov zabra ova tak mto dvojzmyseln m odpovediam syst mu. Plat nep san z sada, e Prologovsk program by mal by nap san tak, aby tak chto odpoved bolo m menej. Nap me [5]> [user]. prsi(nie). ^D [6]> a sp tajme sa: [6]> prsi(nie). [7]> Na ot zku, Je pravda, e nepr? syst m odpovie no. To je u lep ie. itate nos tak chto vstupov a v stupov v ak v zlo itej ch pr padoch nemus by ahk. Okrem toho, na ot zku [7]> prsi(ano). no [8]> by sme op dostali nejednozna n odpove. o vlastne Prolog rob? Pri h adan odpovede na ot zku porovn va vstup s predik tmi v datab zoe. Ak je porovnanie spe n, odpovie, inak no. Hoci jednoargumentov predik t prsi, o ozna ujeme ako prsi/1 ( 1 znamen rnos 5 predik tu ), v datab ze m me, jeho argument nie je unikovate n s argumentom predik tu prsi. Preto odpovedal no. Keby existovali a ie klauzuly toho ist ho predik tu, pok al by sa postupne ka d porovna so vstupom. Napr klad ak bud v datab ze tri klauzuly predik tu prsi/1 [8]> [user]. prsi(nie). prsi(ano). prsi(mozno). 5 aritu

10 2.3. ZOZN MENIE 9 ^D [9]> Na ot zku [9]> prsi(ano). sa Prolog pok si odpoveda takto: N jde prv riadok prsi(nie) a pok si sa ho unikova zo vstupom. To sa mu nepodar, preto prejde na druh klauzulu prsi(ano). T u je unikovate n so vstupnou lohou ( preto e je zhodn ). Preto dostaneme odpove. Jednotliv klauzuly predik tu s teda pre Prolog mo nosti. Na u datab zu pochop tak, e alebo nepr, alebo pr alebo mo no pr. Prolog predpoklad uzavretos vn torn ho sveta o ak va kompletnos a neprotire ivos dajov v datab ze. Tentoraz sme v ak prestrelili, dali sme mu nekonzistentn daje. Povedali sme mu, e pr, e nepr aj e mo no pr. Interpreter Prologu tak to nekonzistentnos dajov zisti nevie. Nepredpoklad, e budeme zad va nelogick daje. Preto aj na ot zku prsi(nie) by sme dostali odpove. Mo nos z ska argument predik tu umo uj premenn. Zo syntaktick ho h adiska je premenn term za naj ci ve k m p smenom alebo znakom pod iarknik. 6. Do datab zy spr vne dajme len jedin fakt [8]> [user]. prsi(nie). ^D [9]> a za pomoci premennej s n zvom Odpoved sa interpretra Prologu sp tajme, i pr : [9]> prsi(odpoved). Opoved = nie. [10]> V borne!toto sme chceli. 6 Klauzuly predik tu musia by ukon en bodkou, ktor nie je s as ou klauzuly a mus ich odde ova aspo jeden biely znak medzera, tabel tor alebo nov riadok.

11 10 KAPITOLA 2. PROLOG Pravidl Doteraz sme do datab zy vkladali len fakty. S to trukt ry s ur it m po tom argumetov ( m e by aj nulov ). Ale m u n m pom c aj pravidl. Chceme napr klad ve mi jednoduch syst m, ktor n s nebude ob a ova inform ciami, i bude pr a alebo nie, ale n s priamo upozorn, i si m me vzia d dnik alebo ho nepotrebujeme. Nap eme preto [10]> [user]. ber_dazdnik(ozaj,odpoved) :- prsi(ozaj), ( Odpoved=ber_dazdnik, Ozaj=ano Odpoved=neber_dazdnik, Ozaj = nie Odpoved='Mozes si zobrat dazdnik, ale nemusis.' ). ber_dazdnik(neviem,'neviem zistit, ci prsi.'). prsi(nie). ^D [11]> Toto je pomerne zlo it pravidlo. Sklad sa z dvoch klauz l. Ka d klauzula pravidla sa sklad z hlavy ( to je as na avo pred znakom :- ) a tela ( to je as za znakom :-, prav strana klauzuly ). Pravidlo je splnen, ak je splnen jeho prav as. Po me teda zisti, o sprav interpreter Prologu v pripade, e mu polo me ot zku [11]> ber_dazdnik(a,b). V datab ze n jde prv klauzulu predik tu ber_dazdnik/2. Ke e v ot zke boli v etky argumety predik tu ber_dazdnik/2 premenn a premenn je mo n naviaza na ak ko vek term, hlava prv ho pravidla nie je pre interpreter probl mom. Zdru premenn A s premennou Ozaj a premenn B s premennou Odpoved. Premenn Ozaj ani premenn Odpoved e te nie s naviazan na ni. S to vo n premenn. Zdru enie dvoch premenn ch znamen, e ak sa v bud cnosti jedna z nich navia e na nejak term, aj druh sa navia e na ten ist term. Ke e hlava pravidla je unikovate n, interpreter Prologu sa pok si splni jeho telo. Telo pravidla je vlastne podcie om hlavn ho cie a ( na ej ot zky ). Podcie pr ve tak ako hlavn cie m e by zlo en z viacer ch cie ov oddelen ch spojkou iarka ( znamenaj cou a ) alebo spojkou bodko iarka ( o znamen alebo ). V na om pr pade prv podcie je ot zka prsi(ozaj). Prolog za ne od za iatku preh ad va datab zu. N jde v nej fakt prsi(nie). Navia e teda premenn Ozaj (at m p dom aj k nej zdru en premenn A ) na fakt nie. Prv podcie je teda splnen. Druh m podcie om je to, o je uzavret v okr hlych z tvork ch. Ak chceme, aby bol splnen predik t ber_dazdnik/2, mus by splnen prv podcie aj druh podcie, preto e s oddelen spojkou iarka ( a ). Druh podcie m op svoje

12 2.3. ZOZN MENIE 11 podciele. Ide o tri podciele, z ktor ch sta, ak bude splnen aspo jeden, preto s oddelen spojkou alebo. Spojka a m vy iu prioritu ako spojka alebo. Preto sme prioritu museli explicitne zabezpe i z tvorkami. Prv podcie najprv navia e premenn Odpoved na at m ( slovo ) ber_dazdnik ale jeho druh as Ozaj=ano nebude splnen. Pre o? Premenn je mo n na nie o naviaza, len ak je vo n, neviazan. Premenn Ozaj je v ak u naviazan na at m nie. Ak by bola vo n, neviazan, test by sp sobil jej naviazanie na hodnotu ano. Ked e v ak u je naviazan, test Ozaj=ano znamen porovnanie nie=ano a to je ne spe n. Preto d jde k navracaniu 7. Prolog sa op pok si splni v raz Odpoved=ber_dazdnik. No tu m zmysel len splnenie in m sp sobom, inak by sa interpreter zacyklil. Ke e in sp sob splnenia v razu Odpoved=ber_dazdnik nie je, interpreter premenn Odpoved a t m p dom aj premenn B, ktor je s ou zdru en, uvo n, odvia e. Stane sa op neviazanou 8 premennou. Interpreter Prologu sa pok si s inou cestou. Vyu ije bodko iarku ( vo vyzname alebo ) aby sa pok sil splni podcie Odpoved=neber_dazdnik,Ozaj=nie. Obidve asti podcie a s splnite n, preto na ot zku [11]> ber_dazdnik(a,b). dostaneme odpove [11]> ber_dazdnik(a,b). A=nie B=neber_dazdnik [12]> Ak by sme v datab ze mali daj prsi(mozno), dostali by sme odpove [12]> ber_dazdnik(a,b). A=mozno B='Mozes si zobrat dazdnik, ale nemusis.' [12]> Veta v apostrofoch je v Prologu ch pan ako jeden at m. o ak predik t prsi/1 ch ba? Potom je prv podmienka tela prvej klauzuly predik tu ber_dazdnik/2 nesplnen a interpreter Prologu sa pok si splni druh klauzulu ber_dazdnik(ano,'neviem zistit, ci prsi.'). Je to vlastne skr ten forma, preto e ka d pravidlo mus ma av i prav stranu. Skr ten forma z pisu sa ch pe tak, e jej prav strana je v dy splnen. V tomto dokonca Prolog nerozli uje pravidlo a fakt, preto e aj fakt 7 ktor stoj za sl vou Prologu 8 vo nou

13 12 KAPITOLA 2. PROLOG prsi(nie). by sme mohli zap sa prsi(nie) :- true. Predik t true m v znam pravda. Je v dy splnen. Na na u ot zku by sme dostali odpove [12]> ber_dazdnik(a,b). A=neviem B='Neviem zistit, ci prsi.' [13]> V na om pr klade sme najprv priradzovali premennej Odpoved hodnotu a a potom testovali hodnotu premennej Ozaj. Hoci sa n program choval spr vne, je logickej ie a r chlej ie d va test v dy na za iatok innosti, preto je rozumnej e prep sa obsah datab zy takto: [10]> [user]. ber_dazdnik(ozaj,odpoved) :- prsi(ozaj), ( Ozaj=ano, Odpoved=ber_dazdnik Ozaj = nie, Odpoved=neber_dazdnik Odpoved='Mozes si zobrat dazdnik, ale nemusis.' ). ber_dazdnik(neviem,'neviem zistit, ci prsi.'). prsi(nie). ^D [11]> Jedn m z nep san ch pravidiel je pod a mo nosti odde ova oddelite n disjunkcie, teda zabr ni v skytu bodko iarky v predik toch 9. Niektor interpretre ( napr klad Turbo Prolog ) dokonca pou itie bodko iarky nedovo uj. V spojen s predik tom write/1, ktor svoj argument vyp e na tandardn v stup, sa m eme zbavi premenn ch pri volan predik tu ( prv premenn bola pri volan predik tu ber_dazdnik/2 aj tak zbyto n ): 9 pokia to nie je pr li n siln

14 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU 13 [10]> [user]. ber_dazdnik :- prsi(ozaj), Ozaj=ano, write ('Prsi, vezmi si dazdnik.'). ber_dazdnik :- prsi(ozaj), Ozaj = nie, write('je krasne, nepotrebujes dazdnik.'). ber_dazdnik :- prsi(_), write('mozes si zobrat dazdnik, ale nemusis.'). ber_dazdnik :- write('neviem zistit, ci prsi.'). prsi(nie). ^D [11]> o znamen pod iarknik? Ak n s hodnota niektor ho argumentu nezauj ma, nap eme namiesto nej pod iarknik. V na om pr pade len chceme vedie, i v datab ze existuje predik t ( fakt alebo splnite n pravidlo ) s n zvom prsi/1 a s ubovo nou hodnotou jeho jedin ho argumentu. E te st le v ak m me zbyto n premenn, ve sme mohli priamo p sa [10]> [user]. ber_dazdnik :- prsi(ano), write ('Prsi, vezmi si dazdnik.'). ber_dazdnik :- prsi(nie), write('je krasne, nepotrebujes dazdnik.'). ber_dazdnik :- prsi(_), write('mozes si zobrat dazdnik, ale nemusis.'). ber_dazdnik :- write('neviem zistit, ci prsi.'). prsi(nie). ^D [11]> Okrem pod iarknika 10 u v na om pr klade in premenn nepotrebujeme. 2.4 Nevyhnutn znalosti program tora v Prologu Modik cia datab zy Prologu Program v Prologu m e modikova s m seba. To znamen, e m e vklada klauzuly do datab zy a vybera ich z nej. Predik t listing/0 vyp e v etky klauzuly v datab ze. V pr pade pr zdnej datab zy nevyp e ni : 10 anonymnej premennej

15 14 KAPITOLA 2. PROLOG [1]> listing. [2]> Vlo me do datab zy klauzulu nejak ho predik tu: [2]> assert(student:-meno('milan Schmotzer')). [3]> Podarilo sa n m vlo i klauzulu do datab zy. Ak by sa v ak v den cii klauzuly nach dzala iarka, syst m by to ch pal ako volanie neexistuj ceho predik tu assert/2 s dvoma argumentami 11. Preto vkladan klauzulu mus me vlo i do z tvoriek: [3]> assert((student:-clovek(m),ucenlivy(m))). [4]> Bodka nie je s as ou klauzuly, preto ju tam ned vame. Predik t listing/0 n m uk e, o je v datab ze: [4]> listing. student :- meno('milan Schmotzer'). student :- clovek(_72), ucenlivy(_72). [5]> Nedajme sa zmias v razom _72. Syst m s m pre seba vn torne ozna uje premenn slom, ktor za na pod iarknikom. Premenn je toti lok lna v r mci jedinej klauzuly a nebije sa preto s ostatn mi premenn mi rovnak ho mena nach dzaj cimi sa v in ch klauzul ch. Niektor syst my namiesto predik tu assert/1 pou vaj predik t asserta/1 na vkladanie pred klauzuly dan ho predik tu a predik t assertz/1 na vkladanie za v etky klauzuly dan ho predik tu. Klauzulu je mo n z datab zy odstr ni pr kazom retract/1, ktor ho argumentom je dan klauzula. Predik ty assert/1 ani retract/1 nie s op tovne splnite n a pri navracan neobnovuj obsah datab zy! 11 Prolog toti predik ty rozli uje pomocou mena a arity ( rnosti ) po tu argumentov.

16 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU Cykly Uva ujme tak to pr klad: [1]> [user]. hero(tom). hero(jerry). hero(columbo). hero(matlock). ^D [2]> A sp tajme sa [2]> hero(who). Who = tom More? ( ) [3]> o znamen veta More?. V preklade je to Viac?. Je mo n ch nieko ko odpoved. Nielen tom je hrdina seri lov, ale aj jerry, columbo a matlock. Syst m n m preto umo n po jednom z skava aj tieto odpovede zad van m bodko iarky. Ak u a ie odpovede od interpretra Prologu nepo adujeme, stla me kl vesu ENTER. [3]> hero(who). Who = tom More? ( ) % Stla il som bodko iarku. Who = jerry More? ( ) % Stla il som kl vesu ENTER. % Zodpovedal som tvoju ot zku a e te mo no % existuj a ie odpovede, preto odpove. [4]> Cel zvy ok riadku za znakom percento sa berie ako koment r a syst mom je ignorovan. Podobne je vo v ine interpretrov Prologu bez oh adu na po et riadkov a slov ignorovan v etko medzi znakmi /* */. Pr klad koment ra: /* Ako vlastne prebieha h adanie a ej ot zky? Interpreter Prologu jednoducho sp sob navracanie pri plne poslednom volanom predik te. T to innos m eme simulova predik tom fail/0, ktor je v dy nesplnen. */ [3]> hero(who),fail. no [4]>

17 16 KAPITOLA 2. PROLOG Ale o sa stalo? Ve sme nedostali iadnu odpove. Predik t fail/0 sp sobil, e nech u bola hodnota premennej Who ak ko vek, cie nikdy nebol splnen. Syst m postupne odsk al v etky mo nosti a potom riekol: Platnos cie a nebola dok zan. Jedinou na ou z chranou s predik ty v stupu: [4]> hero(who), writeln(who), fail. tom jerry columbo matlock no [5]> Ak n m prek a odpove no, m eme nap sa [5]> hero(who), writeln(who), fail true. tom jerry columbo matlock [6]> alebo ranovanej ie [5]> not((hero(who), writeln(who), fail)). tom jerry columbo matlock [6]> Predik t not/1 neguje v sledok svojho argumentu, t.j. ak je jeho argumentom cie, not/1 vr ti, e je nesplnen, ak je splnite n a naopak, e je splnen, ak ho nemo no splni. Nie je to divn predik t, preto e umo uje napr klad kon trukcie [6]> [user]. divak(m):-muz(m), not(hero(m)).

18 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU 17 muz('milan'). ^D [7]> Potom ot zku [7]> divak(divak). Divak = 'Milan' [8]> syst m zodpovie spr vne. Av ak nie je mo n pou i predik t not/1 priamo na generovanie v etk ch mu ov: [8]> [user]. divak(m) :- not(hero(m)), muz(m). muz('milan'). ^D [9]> [9]> divak(divak). no [10]> Podobne existuje aj predik t true/0, ktor je pr ve raz splnite n apredik t repeat/0, ktor je v dy splnite n. Na o n m je predik t repeat/0? Ak chceme napr klad neust ly v pis asu, m eme nap sa : [10]> repeat,time(time(t)),writeln(t),fail. 23:07: :07: :07:

19 18 KAPITOLA 2. PROLOG Predik t writeln/1 je denovan takto: writeln(a) :- write(a), nl. kde nl je nov riadok new line. Nekone n v pis ukon me stla en m kombin cie kl ves Ctrl-C. Existuje aj mo nos odreza zvy ok v po tu. Umo uje ju predik t!/0 zvan rez. Rez je pr ve raz splnite n, podobne ako true/0. Av ak pri pokuse o jeho op tovn splnenie nielen e nebude splnen, ale zabr ni aj sp aniu a ch klauz l toho ist ho predik tu. Bez rezu sme dostali v sledok [11]> hero(who), writeln(who), fail true. tom jerry columbo matlock [12]> Rez pri failnut nedovol navracanie ahne sp sob nesplnenos cel ho predik tu: [12]> hero(who), writeln(who),!, fail true. tom no [13]> Rez je asto jedin m v chodiskom pri pokuse nie o vyrie i. Preto sa programovanie v Prologu ozna uje ako nie isto deklarat vne. Predik ty repeat/0, fail/0 a!/0 s toti viac procedur lneho charakteru ne deklarat vneho. Mnoho teoretikov to Prologu nevie odpusti. Treba v ak poveda, e v etky ostatn programovacie jazyky s na tom s pomerom deklarat vnos versus procedur lnos ove a hor ie. Plat to aj pre assembler umelej inteligencie Lisp, ktor ho meno je odvoden od schopnosti pracova so zoznamami 12. Lisp je v ak procedur lny jazyk. Je to ve mi ob ben n stroj hlavne na Americkom kontinente. Na jeho z klade s postaven kvalitn textov editory ( emacs ) a dokonca aj hry ( abuse ). Lisp je pr jemnej ako jazyk C. Predsa len je to jazyk vy ej rovne, ale zachov va si prvky procedur lnosti. Prolog je jedin deklarat vny takmer neprocedur lny jazyk umelej inteligencie. Je ve mi vhodn na jej aplik cie, preto s v Eur pe a Japonsku pomery lep ie v prospech jazyka Prolog skuto n ho jazyka umelej inteligencie. o je to vlastne inteligencia? Pod a m a prirodzen inteligenciu najv sti nej ie denuje Kurt Tepperwein [Tepperwein-92]: 12 Lisp je skratka pre spracovanie zoznamov LISt Processing.

20 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU 19 V eobecne sa pod inteligenciou rozumie suma du evn ch schopnost a pod a u ieho pojmov ho vymedzenia schopnos nadob da a vyu va vedomosti. Okrem rezu je mo n v etky predik ty denova. Aby sme den cie pochopili, potrebujeme pochopi nasleduj ci odsek Rekurzia Prolog umo uje rekurziu. Pravidlo m e vola samo seba. o to znamen? Uve me si pr klad. [1]> [user]. cislo(0). ^D [2]> Zadajme teraz ot zku [2]> cislo(c). C = 0 [3]> o ak chceme, aby Prolog vypisoval sla do nekone na? M eme sk si nasledovn den ciu: [3]> [user]. cislo(0). cislo(c):-cislo(i),c is I + 1. ^D [4]> Zadajme op ot zku [5]> cislo(c). C = 0 More? ( ) % Stla m bodko iarku. C = 1 More? ( ) % Stla m bodko iarku. C = 2 More? ( ) % Stla m kl vesu ENTER a skon m.

21 20 KAPITOLA 2. PROLOG [6]> Syntax Syntax 13 Prologu je jednoduch. Jedinou syntaktickou polo kou je toti term. Termy m u by trojak : kon tanta ( at m alebo slo ), premenn alebo trukt ra. At m je slovo za naj ce mal m p smenom (milan, ma ka, matlock ) alebo ak ko vek v raz v apostrofoch ('Good morning, sir.' ). sla podporovan interpretrom Prologu aich rozsah s implementa ne z visl. Ka d interpreter vie pracova s cel mi nez porn mi slami. Premenn je slovo za naj ce ve k m p smenom alebo pod iarknikom. trukt ra je zlo en objekt tvaru f(a 1 ::: a n ) kde f je funktor ( jej n zov ) a a 1 a a n s jej argumenty. Hovor me o n- rnej trukt re. Po et argumentov (n) m e by rovn nule, potom trukt ra nem argumenty (je nul rna ). Pr klady trukt r: % Tern rna trukt ra, ktorej prv dva argumenty s nul rne trukt ry % a tret je un rna trukt ra: jedlo(chutne,vegetarianske,pizza(zeleninova)). % Nul rna trukt ra: hello Den cia vstavan ch predik tov Teraz si u kone ne m eme zadenova tandardn predik ty. Najprv predik t true/0. M by pr ve raz splnite n. Ke e v ina syst mov nedovol reden ciu tandardn ch predik tov, nazvime ho ttrue/0. ttrue. Je to pr ve raz splnite n. Teraz predik t fail/0. Ak true je pravda, tak potom fail ( nepravda ) je to, o nie je pravda. 13 form lny sp sob z pisu predik tov

22 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU 21 ffail :- not(ttrue). Nasleduje predik t repeat/0. M by nekone ne ve a kr t splnite n. rrepeat. rrepeat :- rrepeat. A nakoniec not/1: nott(ciel) :- Ciel,!, fail. nott(_). Zd sa V m nekorektn, e sme fail/0 denovali pomocou not/1 a predik t not/1 pomocou predik tu fail/0? M te pravdu. Takto sa to ned. V skuto nosti nie je mo n denova rez ani fail/0. Tieto dva predik ty u mus interpreter Prologu vedie. Rez toti prostriedkami Prologu nie je mo n vyjadri (inak by predsa nemal zmysel ). Predik t fail/0 by bolo mo n nedenova interpreter Prologu by ho potom spr vne ch pal ako nesplnen, av ak niektor interpretre by vyhl sili chybu Volanie neexistuj ceho predik tu Zoznamy Zoznam je tvoren postupnos ou prvkov 14 (kon t nt, premenn ch alebo trukt r ) navz jom oddelen ch iarkami. Zoznam je rekurz vna dajov trukt ra podobn zoznamom v in ch jazykoch ( napr klad v Lispe ). Pr klad [ Matlock, Terminator ] % Zoznam obsahuj ci 2 prvky - premenn. [] % Pr zdny zoznam. Zoznam m v dy hlavu a telo. Je to syntakticky jednoduch z pis trukt ry s n zvom bodka. Predo l zoznamy mo no pomocou tejto trukt ry zap sa :.(Matlock,.(Terminator,[])) [] Zoznam m v dy hlavu a telo. Napr klad hlavou zoznamu [matlock,terminator,saxana] je at m matlock, telom je podzoznam [terminator, saxana]. Na tieto dve asti m eme zoznam rozdeli pomocou oper tora. [1]> [matlock,terminator,saxana] = [A,B,C]. A = matlock B = terminator C = saxana 14 termov

23 22 KAPITOLA 2. PROLOG [2]> [matlock,terminator,saxana] = [A B]. % Pozor, za A je, nie iarka. A = matlock B = [terminator,saxana] [3]> [matlock,terminator,saxana] = [A,B C] A = matlock B = terminator C = [saxana] [4]> [matlock,terminator,saxana] = [A,B,C D]. A = matlock B = terminator C = saxana D = [] [5]> Odkia sa nabral ten pr zdny zoznam? Zoznam je rekurz vna dajov trukt ra kon iaca pr zdnym zoznamom. Pr zdny zoznam je at m []. To je jeho n zov. Nie je to zlo en trukt ra. Pr zdny zoznam sa pou va ako zna ka konca zoznamu. Pr zdny zoznam nie je zlo en trukt ra a ned sa rozlo i na hlavu a telo: [5]> [] = [A B]. no [6]> Zoznamy s rekurz vne dajov trukt ry, preto aj predik ty s nimi pracuj ce s rekurz vne. Na zastavenie innosti rekurz vneho predik tu pracuj ceho so zoznamami asto sl i pr ve nemo nos rozlo enia pr zdneho zoznamu. Nap me predik t pre v pis prvkov ubovo n ho zoznamu: [6]> [user]. vypis_zoznam([]). vypis_zoznam([hlava Telo]):- write(hlava), vypis_zoznam(telo). ^D [7]>

24 2.4. NEVYHNUTN ZNALOSTI PROGRAM TORA V PROLOGU 23 Prv klauzula ukon uje rekurziu v pr pade, e niet o rozobera ( zoznam je pr zdny ). Druh klauzula toti pri pokuse rozobra pr zdny zoznam failne ( a bez prvej by tak cel predik t skon il ne spe ne ). Vzh adom na to, e prv klauzula je splnen len pre pr zdny zoznam a druh klauzula len pre nepr zdny zoznam, bolo by mo n ich poradie zameni bezo zmeny inku. Dokonca by to v Prologoch bez index cie klauz l (napr klad v Arity Prologu ) prinieslo mierne zv enie r chlosti, preto e v priemere sa asi bude vykon va astej ie druh klauzula pracuj ca nad nepr zdnym zoznamom. Vo v eobecnosti v ak zamie anie poradia klauz l v predik toch nie je mo n. Ke e itate nej ie ( vraj ) s rekurz vne predik ty s ukon ovacou podmienkou na za iatku, je rozumn dodr iava tak to poradie.

25 24 KAPITOLA 2. PROLOG

26 Literat ra [Csont -95] [Pol k-92] Doc. Ing. J lius Csont CSc.: Umel inteligencia N vody na cvi enia, vydala elfa, Ko ice, november 1995 Ji Pol k, Jitka Koukol kov, Ivo Marvan: Prolog. Vydala Grada a.s. v Prahe roku Ed cia Nest jte za dv mi. [Tepperwein-92] Kurt Tepperwein: Umenie ahko sa u i, Vydavate stvo FONTANA kiad, 1992, strana

27 26 LITERAT RA

28 Kapitola 3 ECL i PS e 3.1 vod ECL i PS e ( ECRC Common Logic Programming System ) je syst m, ktor ho lohou je sl i ako platforma pre mno stvo logick ch roz ren Prologu. Jeho jadro je efekt vnou implement ciou Edinburghsk ho Prologu. Z kladom ECL i PS e je kompil tor. Prologovsk datab zu skompiluje do virtu lneho k du, nad ktor m potom pracuje interpreter. Kompil cia je ve mi r chla. Prebieha r chlej ie ne u v iny in ch Prologovsk ch syst mov nakonzultovanie datab zy. Interpreter je s as ou kompil torom vytvoren ho k du. Skompilovan program je samostatn. Linkovanie a podobn proced ry s pre pou vate a skryt a nepotrebuje o nich v bec vedie. ECL i PS e si na rozdiel od mnoh ch in ch Prologov pam t n zvy premenn ch a pri v pise neob a uje pou vate ov n zvami premenn ch tvoren mi pod iarknikom a slom. Ide o ve mi exibiln syst m dovo uj ci reden ciu zabudovan ch 1 predik tov a prid vanie nov ch roz ren. M ur it pou vate sky pr jemn vlastnosti, napr klad ak pri volan predik tu z najvy ej ( top-level ) rovne nap eme len za iatok jeho n zvu a stla me kombin ciu kl ves Ctrl-D, ECL i PS e ho dopln 2. Je schopn vyu i v etku pam syst mu. Pracuje pod opera n m syst mom UNIX. Preto je v zdrojovej forme ahko prenosite n na r zne stroje, od mnohoprocesorov ch superpo- ta ov Cray i Silicon Graphics po osobn po ta e PC. ia verzia pre PC ( konkr tne pre UNIXov opera n syst m Linux ) nem implementovan podporu viacer ch procesorov, preto e PC je v inou len jednoprocesorov syst m. To je koda, preto e pr ve Linux vie ve mi dobre pracova s viacprocesorov mi syst mami. Syst m ECL i PS e vylep uje Edinburghsk Prolog, s ktor m je zdola plne kompatibiln, a pon ka ne tandardn dajov trukt ry re azce, glob lne polia a glob lne premenn. Programy je mo n leni do modulov. ECL i PS e vie obsluhova udalosti (je mo n denova obsluhu synchr nnych i asynchr nnych preru en ). 1 tandardn ch 2 ak za iatok n zvu predik tu jednozna ne identikuje jedin predik t zo slovn ka 27

29 28 KAPITOLA 3. ECL I PS E ECL i PS e umo uje usp vanie ( zmrazovanie ) cie ov. Obsahuje kni nice zabezpe uj ce kompatibilitu s mnoh mi in mi interpretrami Prologu. V ina logick ch roz ren je implementovan pomocou atrib tovan ch premenn ch. Je mo n ahko hosp ja s extern mi predik tmi a funkciami nap san mi v jazyku C. Nakoniec, ECL i PS e m zabudovan on-line manu l pre ka d zabudovan predik t. Sta nap sa help(n zov_predik tu) respekt ve help(n zov_predik tu/arita) pre detailnej popis predik tu. 3.2 Roz renia V s asnosti ECL i PS e obsahuje nasleduj ce roz renia: fd kone n dom ny a ohrani enia r line rne racion lne aritmetick ohrani enia chr syst m obsluhy ohrani en propia zobecnen propaga n syst m conjuto kone n mno iny 3.3 Spustenie syst mu ECL i PS e je mo n spusti pr kazom eclipse alebo paraleln ECL i PS e pr kazom peclipse. Pr padn prep na -b s bor nakonzultuje e te pred v pisom promptu s bor za n m uveden. Prep na -e cie sp sob, e sa po spusten syst mu ECL i PS e vykon dan cie a innos syst mu ECL i PS e skon. ECL i PS e sa hl si promptom (v zvou ) [eclipse 1]:, ktor nazna uje, e je otvoren hlavn modul 3 a o ak va sa zadanie prv ho pr kazu ( cie a ). ECL i PS e je mo n ukon i pr kazom halt/0 alebo exit/1. Programy je mo n zad va z hlavnej slu ky ( z hlavnej rovne ) sp sobom uveden m v predo lej v eobecnej kapitole o Prologu. /root# eclipse ECRC Common Logic Programming System [ sepia opium megalog] Version 3.5, Copyright ECRC GmbH, Tue Dec 6 12: [eclipse 1]: [user]. it_rains(). ^D user compiled traceable 516 bytes in 0.00 seconds. [eclipse 2]: 3 V dy mus by nejak modul akt vny, ak iadny nezad me, akt vnym bude hlavn modul.

30 3.4. KOMPIL CIA 29 Pr jemnou s as ou syst mu ECL i PS e je mechanizmus hist rie. Pr kaz je mo n opakova zadan m jeho poradov ho sla, ktor bolo uveden v z tvorkach v zvy pri jeho predo lom spusten. Ak si poradov slo nepam t me, pom e n m predik t h/ Kompil cia Kompil ciu je mo n optimalizova pr kazom nodbcomp/0 zadan m e te pred samotnou kompil ciou. Tento pr kaz vytvor krat a r chlej k d, ktor v ak nebude mo n debugova. Kompilova s bor je mo n pr kazom compile/1, ktor ho jedin m argumentom je n zov s boru. Je mo n pou i skratku [s bor]. Ak chceme naraz skompilova viac s borov, nap eme [s bor_1, s bor_2,..., s bor_n]. 3.5 Dynamick versus statick predik ty ECL i PS e je kompil tor. Ako v om potom funguj predik ty assert/1 a retract/1? Nie je predsa mo n dolo i klauzulu do skompilovan ho predik tu. Pr ve tak ako nie je mo n doplni riadok C s boru do u prelo en ho vykonate n ho s boru. V ECL i PS e je na rozdiel od Prologovsk ch interpretrov nutn pecikova, ktor proced ry ( predik ty ) s statick ( prelo en ) a ktor s dynamick bud interpretovan ( a teda pomal ie ). Na peci- kovanie dynamick ch predik tov pou vame direkt vu dynamic. Pre uk ku si denujme predik ty prsi/1 a snezi/2 ako dynamick : :- dynamic prsi/1, snezi/2. Pre dynamick predik ty m eme pou va predik t assert/1 na vkladanie klauz l do Prologovskej datab zy a predik t retract/1 na vymaz vanie klauz l z datab zy. Predik ty ne pecikovan ako dynamick s pova ovan za statick. 3.6 Kni nice Kni nicu je mo n nahra predik tom :- lib(kni nica). alebo :- use_module(library(kni nica)). Je rozumnej ie pou va prv sp sob, ktor kni nicu nahr, len ak e te nahran nebola.

31 30 KAPITOLA 3. ECL I PS E 3.7 Paraleln vykon vanie programu T to as je tu len pre plnos, ak by itate pracoval na viacprocesorovom po ta i. V tom pr pade m e vyu i tzv OR paralelizmus den ciou predik tu ako paraleln ho: :- paralel pocasie/1. pocasie(prsi). pocasie(snezi). pocasie(slnecne). Ke ECL i PS e pri vykon van programu naraz na predik t pocasie/1, nep jde alej sekven ne, ale paralelne zvy ok programu sabudevykon va na troch procesoroch (lebo s tri cesty cez predik t pocasie/1 ), pri om ka d procesor bude vykon va jednu cestu. Nie je mo n predur i, ktor cesta bude vykon van ktor m procesorom. Pozor, tu sa u men z kladn strat gia Prologu nemalo by z le a na porad klauz l predik tu pocasie/1. Prolog toti implicitne preh ad va priestor rie en do h bky. Sparalelnenie behu programu sp sob iasto n preh ad vanie do rky. To je ve mi d le it! V ur it ch pr padoch preto paraleln ECL i PS e d v sledok r chlej ie ako sekven n ECL i PS e s procesorom o v konnosti porovnate nej s v konnos ou multiprocesorov ho syst mu. Paraleln spracovanie v ak prin a ur it skalia, napr klad ak pre sparalelnenie pou ijeme predik t obsahuj ci klauzuly s rezom apodobne. Pre paraleln ECL i PS e existuj niektor upraven predik ty (napr klad par_member/2 ). 3.8 Aritmetick predik ty Prolog be ne aritmetiock v razy nevyhodnocuje. Napr klad [eclipse 1]: X = X = [eclipse 2]: Aby sme ho don tili v raz vyhodnoti, mus me pou i predik t is. Aritmetick predik ty sa be ne pou vaj v oper torovej forme. Pr klad: [eclipse 2]: X is X = 3.. [eclipse 3]:

32 3.8. ARITMETICK PREDIK TY 31 V razy je mo n porovn va be n mi oper tormi <, >, =<, >=, =:=, =\= ktor maj na obidvoch stran ch v razy ( pred porovnan m sa v razy vyhodnotia ) Numerick typy a konverzie medzi nimi ECL i PS e rozozn va numerick typy cel sla ( integers ), racion lne sla ( rationals ) a desatinn sla (oats ). D ka cel ho sla je limitovan len dostupnou pam ou. Av ak cel sla, ktor sa zmestia do slova po ta a, s reprezentovan ove a efekt vnej ie. Pr klad [eclipse 3]: X is X = [eclipse 4]: Racion lne sla sa nezapisuj vo forme podielu ( napr klad 12 / 37 ), ale pou vaj pod iarknik ( 12_37 ) 4. Desatinn sla nie s reprezentovan ve mi prec zne. Be n nastavenie presnosti zodpoved presnosti oat v jazyku C: [eclipse 4]: X is X = [eclipse 5]: X is X = [eclipse 6]: X is X = % Chybn posledn dvoj slie!!!. % A o a ie slice??? Ak n m t to presnos nesta, m eme zmeni nastavenie glob lnej premennej ur uj cej presnos v po tov: 4 Ak nepotrebujeme kompatibilitu s in mi interpretrami Prologu, m eme natiahn kni nicu rationals a pou va prirodzenej iu not ciu 12/37.

33 32 KAPITOLA 3. ECL I PS E [eclipse 7]: set_flag(float_precision,double).. [eclipse 8]: X is X = [eclipse 9]: sla r znych typov nemo no unikova. sla 7, 7_1 a 7.0 s pre ECL i PS e odli n. Pri porovn van aritmetick ch v razov obsahuj cich sla nerovnak ch typov ich syst m konvertuje v porad : cel! racion lne! float! double Explicitne mo no konverzie vyn ti predik tmi fix/1, rational/1 a float/ Preddenovan aritmetick predik ty Preddenovan aritmetick predik ty s uveden v tabu ke 3.1 (V je aritmetick v raz). Plat X =:= (XmodY )+(X==Y ) Y Pou vate om denovan aritmetick predik ty Pou itie aritmetick ch predik tov je zdanlivo syntakticky nespr vne. [eclipse 1]: X is X = 7. Predik t + je v skuto nosti denovan ako oper tor. Pou va 3 argumenty posledn vracia vypo ta hodnotu. Napr klad v raz 3 * Y / sqrt(pi) Prolog prep e na *(3,1.5,T1), sqrt( ,t2), /(Y,T2,T3), +(T1, T3, T4) To n m umo uje denova napr klad faktori l takto: [eclipse 1]: [user]. :- op(200, yf,!). % Deklar cia predik tu ako un rneho oper tora.!(n,f) :- fac(n,1,f). fac(0, F0, F) :-!, F=F0. fac(n, F0, F) :- N1 is N-1, F1 is F0*N, fac(n1, F1, F). ^D user compiled traceable 504 bytes in 0.00 seconds. [eclipse 2]: X is 23!. % Volame!/2.

34 3.8. ARITMETICK PREDIK TY 33 tvar predik tu popis +V un rne plus ;V un rne m nus abs(v ) absol tna hodnota sgn(v ) znamienko floor(v ) zaokr hlenie nadol round(v ) zaokr hlenie V 1+V2 bin rne s tanie V 1 ; V 2 bin rne od tanie V 1 V 2 bin rne n sobenie V1 / V2 bin rne delenie V1 // V2 celo seln delenie V1 mod V2 oper cia modulo (zvy ok po celo selnom delen ) V1 ^ V2 umoc ovanie min(v 1 V2) minimum max(v 1 V2) maximum nv bitov neg cia V1 /\ V2 bitov konjunkcia V1 \/ V2 bitov disjunkcia xor(v 1 V2) bitov xor ( exkluz vna disjunkcia ) V 1 >> V 2 posun V1 doprava o V2 bitov V 1 << V 2 posun V1 do ava ov2 bitov sin(v ) s nus cos(v ) kos nus tan(v ) tangents asin(v ) arcuss nus acos(v ) arcuscos nus atan(v ) arcustangents exp(v ) e x ln(v ) prirodzen logaritmus sqrt(v ) druh odmocnina pi kon tanta pi = e kon tanta e = fix(v ) konverzia na cel slo (odseknutie ) float(v ) konverzia na desatinn slo rational(v ) konverzia na racion lne (zlomkom vyjadren ) slo numerator(v ) extrakcia itate a z racion lneho sla denominator(v ) extrakcia menovate a z racion lneho sla Tabu ka 3.1: Zabudovan aritmetick predik ty.

35 34 KAPITOLA 3. ECL I PS E X = [eclipse 3]: 3.9 Glob lne premenn a polia Glob lne premenn a polia v klasickom Prologu neexistuj. V syst me ECL i PS e boli navrhnut tak, aby mohli pren a d ta medzi Prologom a jazykom C. Glob lnu premenn vytvor me den ciou jej hodnoty predik tom setval/2. M syntax setval(meno, Hodnota). Pole mus me najprv deklarova predik tom make_array/1. Ke u nie je potrebn, pam pre rezervovan m eme uvo ni predik tom erase_array/1. Pr klad [eclipse 1]: make_array(pole_2d(4,7)). % Deklarujeme 2D maticu rozmerov 4x7. [eclipse 2]: setval(pole_2d(2,1), 'Hello'). % Do policka [2,1] vloz hodnotu.. [eclipse 3]: getval(pole_2d(2,1), Obsah). % Co je v policku [2,1]? Obsah = Hello. [eclipse 4]: erase_array(pole_2d/2). % Uvo ni pam pridelen matici.. [eclipse 5]: Ak chceme etri pam ou, m eme predik tom make_array(pole,typ) denova presnej ie, o bude glob lne pole (matica ) obsahova. Typ m u by byte ( slo od 0 do 256 ), integer (cel slo ), real (desatinn slo ), prolog ( ubovo n term ) alebo global_reference ( glob lna referencia ). Ak pou ijeme jednoargumentov predik t make_array/1, pole bude denovan, ako keby sme pou ili dvojargumentov predik t make_array/2, ktor ho druh m argumentom by bol at m prolog. Glob lna premenn je jednorozmern pole, ktor m e obsahova len jeden prvok. Existuj dva ekvivalentn sp soby den cie glob lnej premennej: make_array(moja_globalna_premenna(1)) alebo make_array(moja_globalna_premenna)

36 3.10. VSTUPY A V STUPY 35 Glob lne polia je pred prv m pou it m potrebn deklarova. Glob lne premenn deklarovan by nemusia, ak ako prv pre pr cu s danou glob lnou premennou pou ijeme predik t setval/2. V pr pade, e syst m ECL 1 PS e zist, e sa pok ame priradi hodnotu neexistuj cej glob lnej premennej, vyvol v nimku ( preru enie ). Ak obsluhu tohto preru enia neredenujeme, obsluhovacia rutina premenn v pam ti syst mu ECL i PS e vytvor a program pokra uje alej akoby sa ni nestalo. Ak nechceme, aby boli glob lne premenn alebo glob lne polia vidite n mimo ur it ho modulu, deklarujeme ich predik tmi make_local_array/1 i make_local_array/ Glob lne referencie Pri ukladan d t do glob lneho po a sa d ta kop ruj. Niekedy je v ak potrebn ma pr stup k origin lom, nie ku k piam. Vtedy je mo n vyu i glob lne referencie. Tie ( na rozdiel od glob lnych pol ) pri navracan ( backtrackingu ) obnovuj svoj stav. M e ich by len nieko ko a sm to by len premenn, nie polia. Vo v eobecnosti sa pou vanie glob lnych referenci neodpor a, preto e m e vies k nezrozumite n m a pomal m programom Vstupy a v stupy Vstup termov zo tandardn ho vstupu a v stup termov na tandardn v stup s realizovan predik tmi read/1 a write/1 Ak chceme v stup presmerova do s boru, mus me ho otvori predik tom open(subor, Mod, Stream) kde Subor je n zov s boru, Mod je m d jeho otvorenia ( read, write, append, update, string ) a Stream je n zov streamu (d tov ho toku ). Napr klad [eclipse 1]: open('/home/milan/hello_word.txt',write,moj_subor), write(moj_subor,'hello, world!'), close(moj_subor).. [eclipse 2]: Ak s bor neuzavrieme a bude be a v po et, ECL i PS e bude dr a v stup v buriado s boru nezap e ni 5. K z pisu ho explicitne m eme don ti predik tom flush/1, napr klad: 5 Presnej ie povedan, nemus do zap sa plne v etko, k m sme pr cu s n m neskon ili alebo k m sme s bor neuzavreli.

37 36 KAPITOLA 3. ECL I PS E [eclipse 2]: flush(moj_subor). [eclipse 3]: To je len pr klad. Ke e stream s n zvom moj_subor sme u uzavreli, v skuto nosti by sme v na om pr pade dostali chybov hl senie. Na na tanie termov je mo n pou i predik ty read(term) resp. read(stream, Term) Na z pis m me k dispoz cii predik ty write(term) resp. write(stream, Term) Doslova pop smenku ( znaku ) m eme vstup na tava predik tmi get(znak) resp. get(stream, Znak) Podobne m eme po znakoch zapisova v stup. K dispoz ciim me predik ty put(znak) resp. put(stream, Znak) Poz ciu pointera 6 v s bore zist me predik tom at(stream, Pointer) a nastavi ju m eme predik tom seek(stream,pointer) Koniec s boru detekuje predik t at_eof(stream) Syst m ECL i PS e obsahuje predik t printf/2 podobn funkcii s rovnak m n zvom v jazyku C. Bli ie vi pou vate sk manu l [ECLManual-95]. 6 ukazovate a

38 3.11. DEBUGGER Debugger Ke vol me Prologovsk proced ru, Prolog volanie interne ozna uje ako CALL. Ak je splnen, nastane EXIT. Inak nastane FAIL a proced ra pred ou ( syntakticky t na avo alebo o rove vy ie ) sa znovusp a nastane REDO. Datab za sa pri pokuse o znovusplnenie u raz splnen ho predik tu nepreh ad va od za iatku, ale za miestom posledn ho splnenia. Ak sa cie usp, nastane DELAY. Ak sa nespln jedna klauzula predik tu, Prolog sk a druh, o ozna ujeme NEXT. Ak je bodom rozhodovania rez, ide o CUT. RESUME nastane, ak sa uspan ( zmrazen ) proced ra rozmraz podmienkami rie enia, ktor nastali. UNIFY nazna uje vydaren unik ciu. ECL i PS e obsahuje pomerne kvalitn debugger na trasovanie programov. Predik tom spy predik t m eme nastavi spy points body zastavenia. Tieto ladiace body nastavujeme na predik ty. Napr klad [eclipse 1]: spy write/1. spypoint added to write / 1 [eclipse 2]: Nastaven m ladiacichbodov predik tom spy sa debugger syst mu ECL i PS e automaticky prepne do skokov ho re imu ( leap mode ). To, ak je pr ve nastaven m d debuggera, m eme zisti pr kazom debugging/0: [eclipse 2]: debugging. Debug mode is leap write / 1 is being spied. [eclipse 3]: Ak s nastaven trasovacie body, debugger po spusten programu vykon v etky predik ty a k m sa nedostane na predik t, na ktor sme nastavili trasovac bod ( spy point ). Tento skokov m d naz vame leap mode. Po zastaven debugger vyp e inform ciu, e za ne vykon va CALL nad dan m predik tom (pokus sa ho splni ). M me dve mo nosti. Alebo pomocou kl vesy c ostaneme v creep m de, pri ktorom sa debugger pri ka dej innosti bude zastavova ( kl vesou ENTER alebo c sp ame a ie volania predik tov ) alebo op stla- me l a prepneme sa do m du leap. Debugger potom pokra uje vo vykon van programu a k op tovn mu zastaveniu d jde len ak bude op volan dan predik t. Explicitne m eme debugger e te pred spusten m programu prepn do creep m du predik tom trace/0: [eclipse 3]: trace. Debugger switched to creep mode [eclipse 4]:

39 38 KAPITOLA 3. ECL I PS E Trasovanie je mo n vypn pr kazom notrace/0: [eclipse 4]: notrace. Ladiace body je mo n nastavi aj na uspat ciele, ktor je tie mo n trasova. U ito n pr kaz pr stupn po as behu debuggera je n. Tento pr kaz je skratkou pre notrace a vypne trasovanie. Pr kaz f (=fail) sp sob failnutie 7 pr ve volan ho alebo vykon van ho predik tu bez oh adu na splnite nos jeho podcie ov. Pr kaz s (=skip) sp sob volanie predik tu bez jeho trasovania. Trasovan pritom nebud ani podciele dan ho predik tu. Pr kaz N vypne debugger plne, tak e pri nasleduj com volan nejakeho cie a z hlavnej slu ky programu (top-level loop ) debugger nebude volan Proler a tatistika Proler zis uje as spotrebovan predik tmi. Na cie Goal spust me proler pr kazom profile(goal). Pr kaz profile(goal,[simple]) vyp e inform cie zvl pre jednoduch predik ty ( napr klad nap san v jazyku C ). tatistiku po et prechodov br nami 8 vyp e predik t print_statistics/0. Je potrebn sp a ho pod doh adom debuggera (predik t divak(m) je m j testovan program ): [eclipse 1]: debug(divak(m)). % Spus program pod doh adom debuggera.. % V sledky programu.... [eclipse 2]: print_statistics.. % tatistika.... [eclipse 3]: 3.13 Usp vanie cie ov Syst m ECL i PS e umo uje usp vanie cielov. Je to vynikaj ca program torsk technika umo uj ca vyvolanie testov len o je to mo n. Ne(na)viazan premenn nie je mo n porovn va s termom: 7 skon enie ne spechom 8 Br nou je CALL, EXIT, FAIL, REDO, DELAY, RESUME, CUT, UNIFY a NEXT.

40 3.13. USP VANIE CIE OV 39 [eclipse 1]: X > 0. instantiation fault in variable X [eclipse 1]: Ak v ak povol me usp vanie testov, potom testy, ktor v ase vykonania nem u by vykonan, bud uspan a op tovne sa vyvolaj, len o to bude mo n. [eclipse 1]: set_flag(coroutine, on).. [eclipse 2]: X > 0. X = X Delayed goals: X > 0. [eclipse 3]: Povolili sme coroutining (usp vanie cie ov ).Test X > 0 nemohol by vykonan, preto e premenn X e te nebola naviazan. Preto ho interpreter syst mu ECLiPSe uspal. K op tovn mu vyvolaniu testu v ak nedo lo, preto e k naviazaniu premennej X nedo lo. Syst m n m uspan ciele vyp sal. In situ cia je v nasleduj com pr klade. [eclipse 3]: X > 0, X = 1. X = 1. [eclipse 4]: Tu bol test pre nesplnenie podmienok na jeho vykonanie op uspan, ale po splnen posledn ho podcie a hlavn ho cie a ( X = 1 ) u podmienkanaviazanosti premennej X splnen bola, preto bol test spe ne vyvolan. Syst m n m u iaden uspan cie nevyp sal. Predik tom delay(term_obsahujuci_premenne,ciel) m eme uspa ubovo n predik t. K jeho vyvolaniu d jde pri naviazan ubovo nej premennej obsiahnutej v terme Term_obsahujuci_premenne. K rozmrazeniu cie a Ciel d jde aj v pr pade, e sa jedna z premenn ch obsiahnut ch v terme Term_obsahujuci_premenne zdru s nejakou inou premennou. Ak potrebujeme pou i in podmienky rozmrazovania ( op tovn ho vyvolania ) cie ov, m me k dispoz cii kni nicu suspend.pl. Usp vanie pomocou predik tu z tejto kni nice je pop san v kapitole 4