Jazyky pro umělou inteligenci

Rozměr: px
Začít zobrazení ze stránky:

Download "Jazyky pro umělou inteligenci"

Transkript

1 VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ FAKULTA STROJNÍHO INŽENÝRSTVÍ Ústav automatizace a informatiky Jiří Dvořák 2005

2 Obsah 1. Úvod Funkcionální programování Logické programování Jazyk Lisp Typy dat Struktura programu Základní funkce Aritmetické a relační operace Definice funkcí Funkce pro pracování seznamů Predikátové funkce Vyhodnocovací funkce Řídicí programové struktury Mapovací funkcionály Definice a vyhodnocení maker Modifikace struktur Reprezentace atomů Vstup a výstup Využití jazyka Lisp pro řešení úloh umělé inteligence Přehled aplikací Příklad využití Lispu pro tvorbu expertního systému Jazyk Prolog Charakteristika a příklad programu Typy a syntaxe dat Syntaxe programu Unifikace Deklarativní a procedurální sémantika Blokový model vyhodnocování Zpracování čísel

3 4.8 Zpracování seznamů Operátorová notace Typové predikáty Rozklad a vytváření termů Meta-logické predikáty Řez Negace Práce s databází Vstup a výstup Cykly Využití jazyka Prolog pro řešení úloh umělé inteligence Přehled aplikací Příklad využití Prologu pro tvorbu expertního systému.. 73 Literatura. 78 Seznam internetových adres Přílohy Příloha A: Přehled definovaných jmen Lispu.. 80 Příloha B: Přehled definovaných jmen a operátorů Prologu 81 Příloha C: Výsledky úloh na procvičení

4 1. Úvod Řešení problémů umělé inteligence (UI) lze naprogramovat i v běžných programovacích jazycích, jako je Pascal nebo C. Vzhledem k charakteru problémů UI jsou pro tento účel často používány speciální programovací jazyky, jako např. Lisp (používaný zejména v USA) a Prolog (populární zejména v Evropě). Speciální programovací jazyky pro UI jsou obvykle založeny na jiných paradigmatech programování (programovacích stylech) než klasické programovací jazyky. Programovací styly Niklaus Wirth (autor jazyka Pascal) zformuloval známou rovnici Program = algoritmus + datové struktury Robert Kowalski (jeden za zakladatelů logického programování) tuto rovnici doplnil takto: Algoritmus = funkce (logika) + řízení Podle toho, na kterou složku algoritmu je kladen větší důraz, můžeme rozlišit dva hlavní programovací styly: Imperativní programovací styl: Je kladen důraz na řídicí složku, tj. JAK se má výpočet provést. Program je tvořen posloupností příkazů. Neimperativní (deklarativní) programovací styly: Řídicí složka je potlačena a důraz je kladen na to CO má být vypočteno. Program je např. tvořen souborem definic funkcí a jejich aplikací ve formě výrazů (funkcionální programování) nebo souborem logických formulí (logické programování), které specifikují řešený problém. Významným rysem deklarativních jazyků (v jejich čisté podobě) je absence přiřazovacího příkazu. Bez tohoto příkazu mohou programátoři pouze deklarovat, jaké účinky by měly vést k jakým výsledkům. Deklarativní jazyky můžeme charakterizovat jako jazyky s referenční transparentností. Referenční transparentnost znamená omezení rozsahu, ve kterém mohou programátoři měnit hodnoty proměnných. V rámci neimperativních programovacích stylů hrají důležitou roli tyto dva styly: Funkcionální styl: základní komponentou programu je funkce. Logický styl: základní komponentou programu je relace. Použití neimperativních jazyků: Řešení speciálních problémů (např. problémů umělé inteligence) Vytvoření prototypu programu, po jehož ověření se může pokračovat imperativním způsobem 1.1 Funkcionální programování Funkcionální program se vytváří jako souhrn definic funkcí a jejich aplikací ve formě výrazů. Jedná se o to, jak vyjádřit daný algoritmus pomocí vzájemně provázaných (zpravidla rekurzivních) funkcí. Výpočet podle takového programu lze chápat jako provedení aplikace nějaké funkce na určitou sadu hodnot jejích argumentů s cílem získat výslednou hodnotu. Počítač - 4 -

5 má ve funkcionálním programování roli vyhodnocovače výrazů přičemž základním krokem vyhodnocení je zjednodušení (redukce) výrazu. Výsledek výpočtu do značné míry nezávisí na pořadí, v němž se redukují jednotlivé dílčí výrazy. To vede ke snížení rizika možných chyb programování a umožňuje paralelní provádění redukčních transformací na víceprocesorových počítačích. Principy funkcionálního programování mohou také vést k navrhování počítačů, jejichž technická realizace už nemusí vycházet z von Neumannova modelu. Definice Výrazy Prostředí Vyhodnocení Výsledky Obr Počítač jako vyhodnocovač výrazů Výhody funkcionálních programovacích jazyků lze shrnout do těchto bodů: dovolují psát kratší a elegantnější programy než v konvenčních jazycích; dovolují psát programy, které vypadají jako specifikace; automatické transformační systémy je pak mohou konvertovat do účinně fungujících programů; funkcionální programy mohou snadno využít paralelismu multiprocesorových systémů. Funkcionální jazyky nahrazují statické datové struktury dynamickými datovými strukturami, kde paměť pro nějakou položku je (automaticky) alokována teprve v okamžiku, kdy položka začíná existovat. Příklady funkcionálních programovacích jazyků: Lisp - 5 -

6 FP Hope Miranda [21] Haskell Při striktním pohledu není možno jazyk Lisp považovat za čistě funkcionální jazyk, protože do různých verzí Lispu byly přidány početné imperativní rysy. Problematikou funkcionálního programování se zabývá např. kniha [7]. Rekurze V neimperativním programovacím stylu je rekurze důležitým nástrojem pro řešení složitých problémů. Taxonomie rekurzivních definic: Vnořená rekurze: rekurzivní volání funkce obsahuje v argumentech volání téže funkce. Příklad: Ackermannova funkce y + 1 ( x = 0) ack ( x, y) = ack( x 1, 1) ( y = 0) ack( x 1, ack( x, y 1)) ( jinak) Kaskádní (stromová) rekurze: ve stejném výrazu se objevuje několik rekurzivních volání, ale bez vzájemného vnoření. Příklad: Funkce pro určení n-tého prvku Fibonacciho posloupnosti n fib ( n) = fib( n 2) + ( n 1) fib( n 1) ( jinak) Lineární rekurze: v každé z alternativ v definici funkce se vyskytuje nejvýše jedno její rekurzivní volání. Příklad: Funkce pro výpočet faktoriálu přirozeného čísla n 1 ( n = 0) fakt ( n) = n * fakt( n 1) ( jinak) Koncová rekurze: speciální případ lineární rekurze, kdy rekurzivní volání je poslední operací příslušné alternativy definice. Příklad: funkce pro výpočet největšího společného dělitele dvou celých kladných čísel x nsd ( x, y) = nsd( x y, y) nsd( x, y x) Příklady převodu definice faktoriálu na koncovou rekurzi: ( x = y) ( x > y) (jinak) - 6 -

7 a) fakt ( n) = fakt1(1, n) m fakt1( m, i) = fakt1( m * i, i 1) ( i = 0) ( i > 0) b) fakt ( n) = fakt2(1, n, 1) m fakt2( m, n, i) = fakt2( m * i, n, i + 1) ( i > n) ( i n) 1.2 Logické programování Při logickém programování těžiště práce tvůrce programu spočívá v nalezení vhodného popisu řešené úlohy a vztahů v ní. Typickým reprezentantem jazyků pro logické programování je jazyk Prolog. Tento jazyk vychází z toho, že pokud máme k dispozici co nejpřesnější popis všech důležitých vlastností světa úlohy, pak je možné využít metod automatického dokazování vět pro nalezení posloupnosti akcí, které povedou k řešení úlohy. Systém automatického dokazování vět tak přebírá roli překladače logického programu a jeho úkolem je navrhnout vhodné zřetězení základních operací počítače pro vyřešení zadané úlohy. Výchozím vyjadřovacím jazykem logického programování je jazyk logiky prvního řádu. Objekty světa jsou v tomto jazyce popisovány pomocí termů, které reprezentují konstanty, proměnné a případně i složené termy vzniklé aplikací funkcí na termy jednodušší. Proměnná je jméno, které zastupuje neznámý objekt splňující formuli, v níž se vyskytuje. Tento objekt může být postupně upřesňován pomocí substituce v průběhu výpočtu. Často se zkoumá, zda dva výrazy logického jazyka lze ztotožnit tím, že se provede vhodná substituce za proměnné v obou výrazech (říkáme, že se hledá unifikující substituce resp. unifikace). Vztahy mezi objekty popisují predikáty, které odpovídají relacím. Prolog je postaven na lineární strategii rezoluce, která se stala jeho hlavním odvozovacím prostředkem. Tato strategie je však úplná jen pro jistou třídu klauzulí, označovanou jako Hornovy klauzule. Klauzule je libovolná konečná disjunkce literálů (atomů) a v Hornově klauzuli se nesmí objevit více než jeden pozitivní atom. Tím jsou poněkud zúženy vyjadřovací možnostmi jazyka Prolog ve srovnání s jazykem predikátové logiky 1. řádu v plné obecnosti. Je-li toto omezení plně respektováno, říkáme, že jde o čistý Prolog. Pro praktické účely se zavádějí různá vhodná mimologická rozšíření. Při přechodu od malých prototypů k rozsáhlým uživatelsky orientovaným systémům naráží použití standardního Prologu na bariéry, způsobené nadměrnými časovými a paměťovými nároky. Tyto problémy sice zčásti řeší kompilační verze překladačů Prologu, ale přesto je programátor často nucen se odchylovat od čistě deklarativního přístupu. Jiným problémem standardního Prologu je unifikace, která dovoluje srovnávat pouze syntakticky příbuzné objekty. Při řešení praktických úloh by však často bylo výhodná možnost srovnávat i objekty sémanticky ekvivalentní. Řešení výše uvedených problémů nabízí nová programovací metoda logické programování s omezujícími podmínkami (Constraint Logic Programming CLP). V CLP je unifikace nahrazena rozhodovací procedurou, která umožňuje využívat jak syntaxi, tak i sémantiku - 7 -

8 zpracovávaných objektů. Základem této procedury je řešení omezujících podmínek (constraint satisfaction). CLP není pouhým rozšířením standardního Prologu, ale jeho zobecněním. Výhody logického programování lze shrnout takto: Logické programování je deklarativní, neboť výsledná posloupnost elementárních akcí vedoucích k cíli je odvozena automaticky bez zásahu programátora. Vzhledem k této vlastnosti je snadné rozšířit logický program o nové informace, datové struktury a pravidla, jak s nimi zacházet. Při použití logických programovacích jazyků je výsledný programový kód krátký a přehledný, což usnadňuje jeho ladění a udržování. Jazyky logického programování mají bohaté prostředky pro konstrukci a definici různých datových struktur. Uživatel má bezprostřední přístup k prvkům složitých struktur bez nutnosti používat ukazatel (pointer). Navíc operace unifikace a zpětného chodu (backtracking) usnadňují srovnávání vzorů a prohledávání prostoru možností. Uvedené vlastnosti podporují metaprogramování, kdy se s programy zachází jako s daty. Příklady jazyků pro logické programování: Prolog ECL i PS e Gödel Mercury - 8 -

9 2. Jazyk Lisp Jazyk Lisp je jedním z nejstarších dosud používaných programovacích jazyků. Původně vznikl koncem 50. let (Mc Carthy, 1960) jako určitá notace pro zápis algoritmů pracujících se seznamy (LISP = LISt Processing). Verze jazyka Lisp: Lisp 1.5 (Mc Carthy, 1962) MacLisp [24] InterLisp Franz Lisp [22] Zeta Lisp Scheme [8] Common Lisp [12] Xlisp V této kapitole jsou popsány pouze základy jazyka Lisp, přičemž se orientujeme zejména na Common Lisp. Podrobněji se s jazykem Lisp můžete seznámit v knihách [10], [12], [18], [22], [24]. 2.1 Typy dat Souhrnně se data v Lispu nazývají S-výrazy (symbolické výrazy). Dělíme je na jednoduché a strukturované. Další dělení ukazuje obr S-výrazy jednoduché (atomy) strukturované čísla symboly tečka-dvojice seznamy celá reálná speciální znaky identifikátory Obr Typy dat v Lispu - 9 -

10 Atomy Atomy jsou základní syntaktickou jednotkou jazyka a zahrnují jednak čísla (celá nebo reálná), jednak symboly (speciální znaky a identifikátory). Příklady atomů: čísla: speciální znaky: + - * < > = identifikátory. alfa Beta1 pocet_atomu ponekud-delsi-atom Identifikátory mohou obsahovat písmena, číslice, pomlčku a podtržítko. Obvykle se nerozlišují velká a malá písmena. Tečka-dvojice (S-výraz1.S-výraz2) Tečka-dvojice představuje binární strom, kde S-výraz1 odpovídá levému podstromu a S-výraz2 pravému podstromu. Tečka-dvojice je fyzicky reprezentována základní lispovskou buňkou (tzv. cons-buňkou), dělenou na 2 části, které obsahují ukazatele na příslušné podvýrazy (viz obr. 2.2). Názvy těchto částí jsou dány historicky (označují části strojového slova na počítači IBM 1040, kde byl Lisp poprvé implementován). address part decrement part S-výraz1 S-výraz2 Obr Fyzická reprezentace tečka-dvojice Příklady tečka-dvojic: (A.B) ((A.B).C) A B C A B Obr Příklady reprezentace tečka-dvojic

11 Seznam (S-výraz1 S-výraz2 S-výrazN) Seznam je tvořen posloupností S-výrazů oddělených mezerami a uzavřených do kulatých závorek. Seznam je vlastně speciální případ tečky-dvojice zapsané ve zkrácené notaci. Zápis seznamu v podobě tečky-dvojice: (S-výraz1.(S-výraz2.(.(S-výrazN.nil) ))) Atom nil je speciální atom, který reprezentuje konec seznamu. Fyzickou implementaci seznamu ukazuje obr S-výraz1 S-výraz2 S-výrazN Obr Fyzická reprezentace seznamu Příklady: seznamová notace tečka notace (A) (A.nil) (A B C) (A.(B.(C.nil))) (A (B C) D) (A.((B.(C.nil)).(D.nil))) Prázdný seznam ( ) je ekvivalentní atomu nil. A B C A D B C Obr Příklady reprezentace seznamů

12 2.2 Struktura programu Program v Lispu se skládá z tzv. forem. Forma (E-výraz) je S-výraz, který lze vyhodnotit lispovským interpretem. Program je tedy posloupností vyhodnotitelných S-výrazů, což znamená, že program má stejný charakter jako jím zpracovávaná data. Typy forem: Číselný atom vyhodnocením se získá číslo vyjádřené zápisem atomu. Symbolický atom (identifikátor) Zápis funkce Symbolický atom (identifikátor) v pozici formy Jestliže se symbolický atom nachází v pozici formy, je považován za proměnnou a jeho vyhodnocením se získá hodnota, která je v daném okamžiku vázána na daný atom. Pokud v okamžiku vyhodnocení není na daný atom žádná hodnota navázána, je signalizována chyba. Proměnné se standardně přiřazenou hodnotou: T hodnota je T (true) NIL hodnota je NIL F hodnota je NIL Pozn.: platí konvence, že jakákoli hodnota různá od NIL vyjadřuje pravdivostní hodnotu true. Zápis funkce Zápis funkce (přesněji zápis aplikace funkce) má tvar seznamu (f a1 a2 an) kde f je jméno (symbolický atom) vyjadřující funkci a a1, a2,, an jsou formy vyjadřující argumenty, na něž se má funkce f aplikovat. Pro zápis funkce se v Lispu používá důsledně prefixová notace, přičemž se celý zápis uzavírá vždy do závorek. Tento požadavek se týká i zápisu aritmetických a relačních výrazů. Při vyhodnocení zápisu funkce Lisp nejprve vyhodnotí všechny argumenty a teprve na získané hodnoty aplikuje funkci f. Pořadí vyhodnocování argumentů není v Lispu přesně specifikováno. Výjimkou z tohoto pravidla jsou speciální funkce, z nichž každá má specifická pravidla pro vyhodnocení (resp. nevyhodnocení) argumentů. Zápisy těchto funkcí se nazývají speciální formy. 2.3 Základní funkce Speciální funkce quote (quote S-výraz) Funkce quote představuje speciální identitu: jejím argumentem může být libovolný S-výraz, který se nevyhodnocuje a funkce jej vrátí jako svůj výsledek

13 Příklad (za šipkou je uvedena výsledná hodnota): (quote (a b)) (a b) Tato identita se může zkráceně zapsat pomocí apostrofu podle následujícího vztahu 'S-výraz (quote S-výraz) Tedy místo (quote (a b)) můžeme napsat '(a b). Použití apostrofu před číselným argumentem je ovšem zbytečné. Speciální funkce setq (setq proměnná forma) Funkce setq je analogií příkazu přiřazení z imperativních jazyků. Prvý argument funkce setq je proměnná, která se nevyhodnocuje. Druhý argument je forma, která se vyhodnotí a její hodnota se naváže na uvedenou proměnnou. Tato hodnota je také výsledkem aplikace funkce setq. Příklady: (setq X 0) 0 X 0 (setq Y '(a b c)) (a b c) Y (a b c) Pokud bychom opomenuli apostrof před seznamem (a b c), systém by se jej pokusil vyhodnotit jako aplikaci funkce a, přičemž b a c by chápal jako proměnné. Pomocí setq je možné zajistit vazbu více proměnných. Vyhodnocování a navazování se v tomto případě provádí postupně. Výslednou hodnotou je hodnota poslední formy. Příklad: (setq prom1 forma1... (setq A 'B A B Funkce car a cdr promn forman) B 'C) C (car forma) B C Hodnotou argumentu musí být tečka-dvojice a hodnotou funkce car je pak první prvek této dvojice. Při aplikaci na neprázdný seznam dostaneme první prvek seznamu. CAR znamená Contents of Address Register

14 (cdr forma) Hodnotou argumentu musí být tečka-dvojice a hodnotou funkce cdr je pak druhý prvek této dvojice. Při aplikaci na neprázdný seznam dostaneme zbytek seznamu. CDR znamená Contents of Decrement Register. Pozn.: Tyto funkce nemají destruktivní charakter původní S-výraz zůstává zachován. Příklady: (car '(A)) (cdr '(A)) (car '(A.B)) (cdr '(A.B)) (car '(A B)) (cdr '(A B)) A nil A B A (B) (car '(A B C)) A (cdr '(A B C)) (B C) Existují také složené funkce tvaru cxx xr, kde místo x může být a (zastupuje car) nebo d (zastupuje cdr). Příslušné funkce se aplikují zprava doleva. Platí např. následující identity: Funkce cons (caar X) (car (car X)) (cadr X) (car (cdr X)) (cons forma1 forma2) Hodnotami argumentů mohou být libovolné S-výrazy. Hodnotou funkce cons je tečka-dvojice vytvořená z prvého a druhého S-výrazu. Provedení funkce cons znamená vytvoření nové consbuňky, obsahující ukazatele na buňky reprezentující uvedené S-výrazy. Příklady: (cons 'A 'B) (A.B) (cons 'A '(B)) (A B) (cons '(A B) '(C D)) ((A B) C D) (car (cons 'A '(B C))) A (cdr (cons 'A '(B C))) (B C) (setq L '(A B)) (A B) (cons (car L) (cdr L)) (A B)

15 Funkce atom a eq (atom forma) Hodnotou argumentu může být libovolný S-výraz. Funkce atom testuje, zda tato hodnota je atom, tj. číslo nebo symbol, a v tom případě má hodnotu T. V opačném případě má tato funkce hodnotu nil. (eq forma1 forma2) Hodnotami argumentů musejí být atomy. Funkce eq testuje, zda tyto hodnoty jsou shodné atomy a v tom případě nabývá hodnotu T. Pokud hodnotami argumentů jsou různé atomy, je výsledkem nil. Příklady: (setq L '(A B)) (A B) (atom L) nil (atom (car L)) T (atom (cdr L)) nil (eq 'A (car L)) T (eq 'A 'B) nil Speciální funkce cond (cond (test1... výsledek1) (test2... výsledek2)... (testn... výsledekn)) Tato funkce zajišťuje větvení výpočtu, tedy výběr z několika alternativ v závislosti na splnění zadaných podmínek. Každá alternativa je vyjádřena seznamem forem, kterému říkáme klauzule. Speciální forma cond se vyhodnocuje tak, že se postupně vyhodnocují formy test na začátku klauzulí, až se nalezne první s hodnotou testu různou od nil. Pro tuto klauzuli se vyhodnotí i ostatní výrazy v ní obsažené a hodnota posledního z nich je výsledkem celé formy cond. Pokud se při vyhodnocení nenalezla žádná úspěšná klauzule, je výsledná hodnota nil. Speciálním případem klauzule je seznam obsahující pouze jediný výraz, který pak slouží současně jako podmínka i jako výsledek. Příklad: forma pro získání absolutní hodnoty proměnné X: (cond ((< X 0) (- 0 X)) (T X))

16 2.4 Aritmetické a relační operace Aritmetické operace: +,, *, / Relační operace: =, <, >, <=, >=, /= (nerovno) Výrazy s těmito operacemi je třeba zapisovat v prefixovém tvaru. Příklady: infixová notace Lisp a + b + c (+ a b c) a * b c (- (* a b) c) a + 2 / (3 b) (+ a (/ 2 (- 3 b))) (a + 2) / (3 b) (/ (+ a 2) (- 3 b)) a < b c (< a (- b c)) x = 0 (= 0 x) x > 0 (> x 0) K porovnání s nulou je možno použít predikáty zerop, plusp a minusp (viz str. 22) 2.5 Definice funkcí Speciální funkce defun (defun jméno-funkce (par1 par2... parn) výraz1 výraz2... výrazm ) Speciální funkce defun zajišťuje definování nových funkcí. Její hodnotou je jméno definované funkce. Při aplikaci takto definované funkce se nejprve vyhodnotí argumenty a jejich hodnoty se navážou na proměnné par1, par2,..., parn. Potom se postupně vyhodnocují výrazy uvedené v těle funkce a hodnota posledního z nich je výsledkem aplikace. Po skončení aktivace funkce se zruší lokálně platné vazby argumentů a obnoví se platnost vazeb z nadřazeného prostředí. Příklad: Definice funkce pro test, zda zadaný seznam je prázdný (defun Prazdny (S) (cond ((atom S) (eq S nil)) (T nil)))

17 Volné a vázané proměnné Výrazy v těle definované funkce nemusejí obsahovat jen proměnné reprezentující argumenty funkce, tj. vázané proměnné (tyto proměnné odpovídají v terminologii imperativního programování formálním parametrům funkce). Kromě vázaných proměnných se v těle funkce mohou vyskytovat i tzv. volné proměnné, které jsou vedle argumentů dalším nástrojem komunikace funkce s jejím okolím (tyto proměnné představují v terminologii imperativního programování nelokální proměnné). Rozlišení proměnných na volné a vázané se v Lispu netýká jen definice funkcí pomocí defun, ale také všech dalších lispovských konstrukcí, které zavádějí proměnné s lokálně vymezeným rozsahem platnosti (např. speciální funkce let viz s. 27). Existují dva způsoby určení vazby volné proměnné: Statické určení: Funkce si při své aktivaci přináší vazbu volné proměnné z globálního prostředí. Dynamické určení: Vazba volné proměnné se zjišťuje až v místě volání podle nejblíže nadřazeného prostředí, které tuto volnou proměnnou váže. Pro Lisp je typické dynamické určení rozsahu, avšak některé varianty Lispu používají statické určení rozsahu, neboť to umožňuje efektivnější kompilaci funkcí. Je třeba poznamenat, že používání volných proměnných je v rozporu se snahami o srozumitelnou a modulární strukturu programů. Příklad: Program pro testování typu vazby volné proměnné: (setq S '(STATICKA)) (defun Pripoj (X) (cons X S)) (defun Test (S Y) (pripoj Y)) Zkoušku provedeme aplikací funkce Test: (Test 'DYNAMICKA 'VAZBA) ; S je volna promenna Jiná podoba tohoto programu využívající funkci let je uvedena na str. 27. Programování rekurzivních funkcí Typické možnosti pro testování triviálních alternativ v definici funkce a pro redukci argumentu v rekurzivním volání: Pro číselný argument testujeme rovnost nule nebo jedné, případně i zápornou hodnotu argumentu; do rekurzivní větve dáváme zmenšenou hodnotu argumentu (typicky o hodnotu jedna), obecně hodnotu bližší triviální alternativě. Pro seznam zpracovávaný jen v nejvyšší úrovni testujeme, zda seznam je prázdný a argument redukujeme pomocí cdr

18 Pro obecně strukturovaný S-výraz testujeme většinou jako zvláštní případy prázdný seznam a atom (v tomto pořadí) a argument redukujeme pomocí car i cdr. Příklady: Definice funkce pro výpočet faktoriálu (defun Faktorial (N) (cond ((= N 0) 1) Definice funkce pro spojení dvou seznamů (defun Spoj (X Y) (T (* N (Faktorial (- N 1)))) )) (cond ((Prazdny X) Y) (T (cons (car X) (spoj (cdr X) Y))) )) Definice funkce pro testování shodnosti S-výrazů (defun Stejne (X Y) Úlohy na procvičení (cond ((atom X) (cond ((atom Y) (eq X Y)) (T nil))) ((atom Y) nil) ((stejne (car X) (car Y)) (stejne (cdr X) (cdr Y))) (T nil))) a) Definujte funkci pro výpočet absolutní hodnoty zadané proměnné (viz s. 82). b) Definujte funkci pro určení maxima ze dvou čísel (viz s. 82). c) S využitím funkce prázdný definujte funkci pro výpočet délky seznamu, tj. počtu prvků na nejvyšší úrovni (viz s. 82). d) S využitím funkce prázdný definujte funkci pro získání posledního prvku na nejvyšší úrovni seznamu (viz s. 82). e) S využitím funkce prázdný definujte funkci pro odstranění posledního prvku na nejvyšší úrovni seznamu (viz s. 82)

19 2.6 Funkce pro zpracování seznamů Funkce append (append seznam-forma1... seznam-forman) Funkce append může mít proměnný počet argumentů. Hodnotami argumentů musejí být seznamy a výsledkem je seznam vzniklý spojením těchto seznamů. Při provedení funkce append se tolikrát provede primitivní konstruktor cons, kolik činí součet délek seznamů ve všech argumentech kromě posledního. Funkce list (append '(A B) '(C D)) (A B C D) (list forma1... forman) Funkce list může mít rovněž proměnný počet argumentů, ale jejich hodnotami mohou být libovolné S-výrazy. Výsledkem je seznam těchto S-výrazů. Jedno provedení funkce list má za následek tolik aplikací primitivního konstruktoru cons, kolik má list argumentů. (list '(A B) '(C D)) ((A B) (C D)) Příklad: Aplikace funkcí append a list pro obrácení pořadí prvků seznamu na nejvyšší úrovni (funkce prazdny byla definována na str. 16). Funkce last (defun obraceni (x) (cond ((prazdny x) nil) (t (append (obraceni (cdr x)) (last seznam-forma) (list (car x)) )))) Funkce last má jeden argument, jehož hodnotou musí být seznam. Výsledkem je seznam obsahující pouze poslední prvek seznamu v argumentu. (last '(A B C)) (C) (last '((A B) (C D))) ((C D)) Funkce length (length seznam-forma) Funkce length má jeden argument, jehož hodnotou musí být seznam. Výsledkem je počet prvků na nejvyšší úrovni seznamu v argumentu. (length '(A B C)) 3 (length '((A B) (C D)))

20 Funkce reverse (reverse seznam-forma) Funkce reverse má jeden argument, jehož hodnotou musí být seznam. Výsledkem je obrácený seznam, přičemž obracení se týká pouze nejvyšší úrovně seznamu a nižší vrstvy zůstávají nedotčeny. (reverse '(A B C)) (C B A) (reverse '((A B) (C D))) ((C D) (A B)) 2.7 Predikátové funkce Funkce equal (equal forma1 forma2) Funkce equal má dva argumenty, jejichž hodnotami mohou být libovolné S-výrazy. Pokud jsou shodné, výsledkem je T, v opačném případě je výsledkem nil. Funkce null (setq X '(A B C)) (A B C) (equal X X)) T (equal X '(A B C))) T (equal X 'X)) (equal 'X 'X)) (null seznam-forma) nil T Funkce null má jeden argument, jehož hodnotou by měl být seznam. Pokud je tento seznam prázdný, výsledkem je T, v opačném případě je výsledkem nil. (setq X '(A)) (A) (null X) (null '()) nil T (null (car X)) nil (null (cdr X)) T Funkce member (member forma seznam-forma) Funkce member má dva argumenty. Hodnotou prvého je libovolný S- výraz a hodnotou druhého musí být seznam. Funkce testuje existenci S-výrazu na nejvyšší úrovni seznamu. V případě úspěchu vrací nikoli hodnotu T, ale část seznamu začínající tímto S-výrazem. Při neúspěchu vrací samozřejmě nil

21 Funkce listp (setq X '(C A D (B D) A)) (C A D (B D) A) (member 'A X)) (A D (B D) A) (member 'B X)) nil (member '(B D) X)) ((B D) A) (listp forma) Funkce listp má jeden argument. Tato funkce testuje, zda hodnotou argumentu je seznam. (setq X '(A B C)) (A B C) (listp X) (listp (car X)) (listp (cdr X)) Funkce numberp (numberp forma) T nil T Funkce numberp má jeden argument a testuje, zda hodnotou tohoto argumentu je číslo. (setq X '(A 1 2)) (A 1 2) (numberp (car X)) nil (numberp (car (cdr X))) T Funkce symbolp (symbolp forma) Funkce symbolp má jeden argument a testuje, zda jeho hodnotou je symbol. (setq X '(A 1 2)) (A 1 2) (symbolp (car X)) T (symbolp (car (cdr X))) nil Funkce boundp (boundp forma) Funkce boundp má jeden argument, jehož hodnotou by měl být symbolický atom. Pokud je na tento atom navázána hodnota, funkce vrací T, jinak vrací nil. (setq X '(A B C)) (A B C) (boundp X) (boundp (car X)) T nil

22 Funkce pro porovnávání s nulou (zerop forma) Funkce zerop má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je rovna nule. (plusp forma) Funkce plusp má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je kladná. (minusp forma) Funkce minusp má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je záporná. Příklady: Funkce not (setq X -5 (zerop X) Y 7) 7 nil (zerop (+ X 5)) T (plusp X) nil (plusp (+ X Y)) T (minusp X) T (minusp (+ X Y)) nil (not forma) Tato funkce je v podstatě synonymem pro predikát null. Je však doporučeno ji používat jako zdůraznění, že se nejedná o testování konce seznamu, ale o logickou negaci (v lispovském pojetí). Platí: Příklady: (not nil) => T (not x) => nil pro x nil (setq X '(A B C)) (A B C) (not (member 'B X)) nil (not (member 'D X)) T Funkce and a or Predikáty and a or jsou speciální funkce zajišťující výpočet logického součinu a logického součtu svých argumentů v lispovské interpretaci

23 (and forma1 forman) Funkce and vyhodnocuje své argumenty tak dlouho, až narazí na prvý s hodnotou ni1 a pak vrátí nil. Jinak vyhodnotí všechny argumenty a vrací hodnotu posledního. (or forma1 forman) Funkce or vyhodnocuje své argumenty tak dlouho, až narazí na prvý s hodnotou různou od ni1 a jeho hodnotu pak vrátí jako výsledek. Jinak vyhodnotí všechny argumenty a vrátí nil. Z uvedeného popisu vyplývá, že tyto speciální funkce vyhodnotí vždy jen tolik argumentů, kolik je zapotřebí k určení výsledku. Příklady: (setq X '(A B C D)) (A B C D) (and (member 'B X) (member 'C X)) (C D) (and (member 'A X) (member 'F X)) nil (or (member 'B X) (member 'C X)) (B C D) (or (member 'E X) (member 'F X)) nil Úlohy na procvičení a) Pomocí základních funkcí a funkcí null a equal definujte funkci pro test, zda S-výraz X je prvkem seznamu S na nejvyšší úrovni (viz s. 82). 2.8 Vyhodnocovací funkce Funkce eval (eval forma) Funkce eval je základem vyhodnocovacího systému Lispu. Tato funkce má jediný argument a pokud je použita v explicitním volání, dojde ke dvojímu vyhodnocení tohoto argumentu: poprvé se vyhodnotí jako argument kterékoliv jiné funkce, získaná hodnota se pak předá funkci eval a ta ji pak vyhodnotí znovu. Hodnota argumentu funkce eval musí mít jeden z těchto tvarů: číselný atom eval vrátí totéž číslo symbolický atom eval vrátí hodnotu vázanou na toto jméno seznam tvaru (f a l a 2... a n ), kde f je jméno funkce a každé a j lze opět vyhodnotit Prostřednictvím funkce eval dostává programátor velmi mocný nástroj: může totiž dynamicky vytvořit určitou část programu a takto vytvořenou část bezprostředně jako program vyhodnotit. Příklad: (setq A 'B B 'C) C

24 (eval 'A) (eval A) Funkce apply B C (setq X '(A B) Y '(1 2 3) Z '(X Y)) (X Y) (eval (cons 'append Z)) (A B 1 2 3) Při vyhodnocení zápisu funkce v Lispu se vyhodnotí její argumenty, z jejich hodnot se udělá seznam a ten se předá k aplikaci. Ta část vyhodnocovacího systému, která aplikaci funkce provádí, je v Lispu k dispozici prostřednictvím funkce apply. (apply funkce-forma seznam-forma) Funkce apply má dva argumenty. Hodnotou prvého argumentu musí být jméno funkce a hodnotou druhého musí být seznam hodnot jejích argumentů. Platí vztah (apply 'fce '(val 1 val 2 val n )) = (fce arg 1 arg 2 arg n ) kde val i je hodnota argumentu arg i. (apply 'cons '(A (B C))) (A B C) Funkce funcall (funcall funkce-forma forma1 forman) Tímto zápisem se zajistí aplikace funkce, která je hodnotou výrazu funkce-forma, na argumenty vypočtené jako hodnoty výrazů forma1,, forman. (funcall 'cons 'A '(B C)) (A B C) 2.9 Řídicí programové struktury Spolu s funkcí cond je v Lispu základním nástrojem pro řízení výpočtu rekurze (viz str. 17). Použití rekurze má ovšem jisté nevýhody. Při rekurzivním volání funkcí dochází ke větší spotřebě strojového času, než kolik by potřeboval odpovídající iterační algoritmus. Dále jsme v tomto případě při výpočtu i té nejjednodušší rekurzivně definované funkce omezeni maximální kapacitou zásobníku, pomocí něhož systém provádí rekurzivní volání. Iterativní verze mají při výpočtu konstantní paměťové nároky a podobné nebezpečí u nich tedy nehrozí. Pokud je to možné, je vhodné používat koncovou rekurzi (viz str. 6), protože řada překladačů Lispu dovede automaticky převést koncovou rekurzi na iteraci. Příklady použití koncové rekurze: Obrácení pořadí prvků seznamu (defun obraceni_kr (x) (obrat x nil))

25 (defun obrat (sez revs) Délka seznamu (cond ((null sez) revs) (t (obrat (cdr sez) (cons (car sez) revs))) )) (defun delka_kr (x) (delkr x 0)) (defun delkr (x pocet) (cond ((null x) pocet) (t (delkr (cdr x) (+ 1 pocet))) )) Z důvodů možných problémů s použitím rekurze je i jazyk Lisp vybaven prostředky dovolujícími explicitní používání iteračních konstrukcí, přestože neodpovídají klasickému funkcionálnímu stylu. Speciální funkce do (do ((var1 ini-forma1 opak-forma1) ; předpisy pro práci (var2 ini-forma2 opak-forma2)... (varn ini-forman opak-forman)) (test výraz1 výraz2... výrazk) forma1 forma2... formam ) ; s proměnnými cyklu ; testovací klauzule ; tělo cyklu Výrazy opak-forma mohou být vynechány, výrazy ini-forma mohou být vynechány pouze současně s odpovídajícími výrazy opak-forma. Vynechány mohou být také výrazy test a současně výraz1 až výrazk v testovací klauzuli nebo výrazy forma1 až formam v těle cyklu do. Vyhodnocení formy do: 1. Vyhodnotí se všechny výrazy ini-forma určující počáteční hodnoty proměnných cyklu. 2. Výsledné hodnoty se navážou na proměnné; kde hodnota nebyla uvedena, dosadí se nil. 3. Je-li testovací klauzule neprázdná, vyhodnotí se test; a) je-li úspěšný, vyhodnotí se postupně všechny výrazy v klauzuli, cyklus se ukončí a výsledkem je hodnota posledního výrazu, b) je-li neúspěšný, pokračuje se krokem Je-li testovací klauzule prázdná, cyklus končí s hodnotou nil. 5. Vyhodnotí se postupně všechnu formy těla cyklu. 6. Vyhodnotí se všechny části opak-forma

26 7. Hodnoty získané v kroku 6 se navážou na příslušné proměnné. 8. Pokračuje se krokem 3. Je důležité si uvědomit, že vyhodnocení výrazů předepisujících počáteční nebo změnové hodnoty proměnných cyklu se provádí dříve, než se jakákoliv z těchto hodnot naváže na příslušnou proměnnou, tedy vlastně jakoby paralelně. Chování cyklu tudíž vůbec nezávisí na pořadí, v jakém na začátku cyklu uvedeme jednotlivé proměnné. Příklad: Obrácení pořadí prvků seznamu pomocí iterace (defun obraceni_i (x) (do ((sez x (cdr sez)) (revs nil (cons (car sez) revs))) ((null sez) revs) )) Speciální funkce dolist a dotimes (dolist (var list-forma result-forma) forma1... forman) Při vyhodnocování se na proměnnou var postupně navazují jednotlivé prvky seznamu, který se dostane vyhodnocení výrazu list-forma, přičemž pro každou hodnotu se provede vyhodnocení všech forem těla cyklu. Výsledná hodnota je pak určena hodnotou formy result-forma. (dotimes (var pocet-forma result-forma) forma1... forman) Při vyhodnocování se proměnné var postupně přiřazují hodnoty od 0 do hodnoty počet-forma 1, přičemž pro každou hodnotu se provede vyhodnocení všech forem těla cyklu. Výsledná hodnota je pak určena hodnotou formy result-forma. Příklady: Sečtení prvků číselného seznamu pomocí dolist (defun sum-list (num-list) (setq s 0) (dolist (p num-list s) (setq s (+ s p)))) Výpočet faktoriálu pomocí dotimes (defun fakt (n) (setq m 1) (dotimes (i n m) (setq i (+ i 1)) (setq m (* m i))))

27 Speciální funkce typu prog (prog1 výraz1 výraz2... výrazn) (prog2 výraz1 výraz2... výrazn) (progn výraz1 výraz2... výrazn) (progv (var1 var2... varn) (exp1 exp2... expn) forma1 forma2... formam) Funkce prog1, prog2 a progn vyhodnotí postupně své argumenty; prog1 vrací hodnotu prvního výrazu, prog2 vrací hodnotu druhého a progn vrací hodnotu posledního. Všechny tyto funkce tedy vytvářejí obdobu složeného příkazu jazyka Pascal. Funkce progv nejprve vyhodnotí všechny výrazy exp1 až expn, pak naváže jejich hodnoty na odpovídající proměnné, a potom postupně vyhodnocuje výrazy forma1 až formam. Výsledkem je hodnota poslední formy. Kromě uvedených funkcí existuje také speciální funkce prog, jejíž tělo je obdobou imperativního programu. V těle této funkce se dokonce může objevit funkce go, umožňující nepodmíněný skok. Speciální funkce let (let ((var1 ini-forma1) (var2 ini-forma2)... (varn ini-forman)) forma1 forma2... formam) Var je symbolický atom označující zaváděnou lokální proměnnou a ini-forma je (počáteční) hodnota této proměnné. Je také možné inicializační výraz vůbec neuvést a příslušná proměnná má pak počáteční hodnotu nil. Nejprve se vyhodnotí všechny výrazy ini-forma a teprve pak se provede jejich přiřazení proměnným (na pořadí proměnných tedy nezáleží). Potom se postupně vyhodnotí forma1 až formam, přičemž výsledkem je hodnota poslední formy. Příklad: Program pro test typu vazby volné proměnné (viz str. 17) s použitím funkce let: (setq S '(STATICKA)) (defun Pripoj (X) (defun Test (Y) (cons X S)) (pripoj Y)) (let ((S 'DYNAMICKA)) (Test 'VAZBA)) ; S je volna promenna

28 Úlohy na procvičení a) Definujte funkci pro výpočet faktoriálu pomocí koncové rekurze (viz s. 83). b) Definujte funkci pro výpočet faktoriálu pomocí iterace (viz s. 83). c) Definujte funkci pro sečtení prvků číselného seznamu pomocí iterace (viz s. 83) Mapovací funkcionály Často je zapotřebí aplikovat nějakou funkci na všechny prvky seznamu. Pro takovéto účely je výhodné používat mapovací funkcionály. Funkcionál mapcar (mapcar funkce-forma seznam-forma1... seznam-forman) Funkcionál mapcar aplikuje funkci, která je hodnotou výrazu funkce-forma na jednotlivé (stejnolehlé) prvky seznamů (tyto seznamy jsou hodnotami forem seznam-forma) a vrací seznam výsledků. (mapcar '+ '(1 2 3) '(3 2 1)) (4 4 4) (mapcar (car '(cons list)) '(A B C) '(D E F)) ((A.D) (B.E) (C.F)) (mapcar (cadr '(cons list)) '(A B C) '(D E F)) Pozn.: (cadr x) (car (cdr x)) ((A D) (B E) (C F)) Příklad: Určení počtu atomů na všech úrovních seznamu pomocí apply a mapcar. (defun PocetAtomu (S) Funkcionál mapc (cond ((null S) 0) ((atom S) 1) (T (apply '+ (mapcar 'PocetAtomu S))) )) (mapc funkce-forma seznam-forma1... seznam-forman) Funkcionál mapc aplikuje funkci na jednotlivé (stejnolehlé) prvky seznamů a vrací triviální hodnotu (zpravidla nil nebo první seznam). Funkcionál maplist (maplist funkce-forma seznam-forma1... seznam-forman) Funkcionál maplist aplikuje funkci na celé seznamy, pak na jejich zbytky atd., a vrací seznam výsledků

29 (maplist 'cons '(A B C) '(D E F)) (((A B C).(D E F)) ((B C).(E F)) (C.F)) (maplist 'append '(A B C) '(D E F)) Funkcionál mapl ((A B C D E F) (B C E F) (C F)) (mapl funkce-forma seznam-forma1... seznam-forman) Funkcionál mapl aplikuje funkci na celé seznamy, pak na jejich zbytky atd., a vrací triviální hodnotu (zpravidla nil nebo první seznam). Lambda výraz Ve spojení s mapovacími funkcionály se často používají anonymní funkce zavedené pomocí lambda výrazů. (lambda (par1 par2... parn) výraz1 výraz2... výrazm) Lambda-výraz představuje nepojmenovanou funkci. Seznam parametrů (lambda-seznam) určuje, jaké jsou vázané proměnné této funkce. Na ně se při aplikaci navážou hodnoty argumentů a pak se postupně vyhodnotí výrazy výraz1, výraz2,..., výrazm. Výsledná hodnota je určena hodnotou posledního výrazu. Lambda-výraz využíváme buď pro zavedení anonymní funkce v místě jejího použití nebo jako prostředek lokálního přizpůsobení počtu argumentů nějaké funkce (a fixaci zbývajících). Příklad: Přičtení skaláru ke každému prvku vektoru pomocí lambda a mapcar. (defun PrictiSkalar (Skalar Vektor) (mapcar '(lambda (X) (+ Skalar X)) Vektor)) Poznamenejme, že v některých implementacích Lispu je nutno před lambda výraz psát místo apostrofu dvojici znaků #'. (mapcar #'(lambda (X) (+ Skalar X)) Vektor)) Tato dvojice znaků má stejný účel jako samotný apostrof, tj. zabraňuje vyhodnocení následujícího S-výrazu, a používá se tehdy, jestliže následující S-výraz představuje funkci Definice a vyhodnocení maker Předpokládejme, že často potřebujeme navázat na nějakou proměnnou hodnotu nil a tudíž pro tento účel definujeme funkci: (defun Niluj (Arg) (setq Arg nil))

30 Pokusme se nyní tuto funkci aplikovat: (Niluj X) Chyba, nenavazana promenna Při aplikaci funkce Niluj se nejprve totiž vyhodnotí její argument. Protože na X dosud nebyla navázána žádná hodnota, je signalizována chyba. Zkusme nyní ověřit, co by se dělo, kdyby na X nějaká hodnota už navázána byla: (setq X 99) 99 (Niluj X) nil X 99 Vidíme, že ani teď to nefunguje. Hodnota nil se totiž v rámci funkce Niluj naváže na lokální proměnnou Arg, kdežto proměnná X zůstane beze změny. Pro řešení takovýchto situací v Lispu existují makra, která na rozdíl od funkcí poskytují jiný mechanismus vyhodnocení své aplikace. Speciální funkce defmacro (defmacro jméno-makra (par1 par2... parn) výraz1 výraz2... výrazm) Při vyhodnocení aplikace makra se na parametry makra navážou nevyhodnocené argumenty a pro ně se provede vyhodnocení jednotlivých výrazů v rámci prostředí, v němž se nachází definice makra. Tato první etapa vyhodnocení se nazývá expanze makra a jejím výsledkem je hodnota posledního výrazu z těla definice makra. Výsledek expanze se pak opět považuje za E-výraz a ten se ve druhé etapě znovu vyhodnotí, tentokrát ale v prostředí místa aplikace makra. Definice a použití operace Niluj jako makra vypadá následovně: (defmacro Niluj (Arg) (Niluj X) X nil (list 'setq Arg nil)) Niluj expanze (setq X nil) nil Jiným příkladem aplikace makra jsou aplikace zásobníkových operací. Předpokládejme, že zásobník je implementován jako seznam, přičemž začátek seznamu představuje vrchol zásobníku. V následujícím příkladě je definována operace vložení prvku na vrchol zásobníku. Příklad: (defmacro Push (Element Stack) (list 'setq Stack (list 'cons Element Stack)))

31 (Push X Z) expanze (setq Z (cons X Z)) Aby se zkrátila a zjednodušila definice makra, byl zaveden mechanismus obráceného apostrofu, který nahrazuje použití funkce list. Obrácený apostrof funguje jako normální apostrof (tj. zabraňuje vyhodnocování) s tím, jakákoli čárka, která se vyskytne uvnitř jeho rozsahu, zruší jeho účinek (tj. povolí vyhodnocení) pro následující S-výraz. Výše definovaná makra můžeme pomocí této notace zapsat takto: (defmacro Niluj (Arg) (setq,arg nil)) (defmacro Push (Element Stack) (setq,stack (cons,element,stack))) 2.12 Modifikace struktur Ve striktně chápaném funkcionálním programování se datové struktury pouze vytvářejí a jako celek pak mohou být zařazovány do vyšších struktur nebo být zrušeny, nelze je však měnit. Každá modifikace struktury znamená v takovém případě její kompletní rekonstrukci (tj. nové vytvoření), i když se bude lišit např. jen v záměně jednoho atomu za jiný. Tento přístup by v praktických aplikacích mohl vést k neúnosným časovým nárokům nebo ke zbytečnému čerpání buněk volné paměti (což se v konečném efektu projeví mimo jiné opět zpomalením výpočtu). Jazyk Lisp proto dává uživateli možnost modifikovat existující datové struktury. Funkce rplaca a rplacd Názvy těchto pseudofunkcí jsou odvozeny z anglických výrazů replace car a replace cdr, které vyjadřují jejich sémantiku. (rplaca forma-tečka-dvojice forma-nový-car) Tato funkce modifikuje 1. část tečky-dvojice, která je hodnotou prvého argumentu tak, že do ní uloží odkaz na hodnotu druhého argumentu. Dojde tedy k náhradě prvního prvku tečky-dvojice za jiný, ale nestane se tak vytvořením nové tečky-dvojice, nýbrž modifikací původní struktury. (rplacd forma-tečka-dvojice forma-nový-cdr) Tato funkce modifikuje 2. část tečky-dvojice, která je hodnotou prvého argumentu tak, že do ní uloží odkaz na hodnotu druhého argumentu. Příklady: (setq X '(A B C)) (A B C) (setq Y '(1)) (1) (rplaca X Y) ((1) B C) X ((1) B C) (rplacd Y (cdr X)) (1 B C)

32 Funkce nconc Y (1 B C) X ((1 B C) B C) (nconc seznam-forma1 seznam-forman) Funkce nconc může mít proměnný počet argumentů. Hodnotami argumentů musejí být seznamy a výsledkem je seznam vzniklý jejich spojením. Přitom se změní struktura všech těchto seznamů kromě posledního, což se projeví také ve všech strukturách, do nichž byly příslušné seznamy dříve začleněny. Příklady: Funkce setf (setq X '(A B)) (A B) (setq Y '(C D)) (C D) (setq Z '(E F)) (E F) (setq P (cons X Y)) ((A B) C D) (nconc X Y Z) (A B C D E F) X (A B C D E F) Y (C D E F) Z (E F) P ((A B C D E F) C D E F) (setf forma1 forma2) Funkce setf má dva argumenty. První musí určovat nějaké místo a druhý určuje hodnotu, která se na toto místo dosadí. Následující zápisy jsou tedy sémanticky ekvivalentní: Příklady: (rplaca X Y) (setf (car X) Y) (rplacd X Y) (setf (cdr X) Y) (setq X cons 'A 'B)) (A.B) X (setf (car X) 'C)) X (setf (cdr X) 'D)) X (A.B) C (C.B) D (C.D)

33 Funkcionály mapcan a mapcon (mapcan funkce-forma seznam-forma1 seznam-forman) Funguje jako funkcionál mapcar, ale vrací seznam vzniklý spojením dílčích výsledků pomocí funkce nconc. (mapcon funkce-forma seznam-forma1 seznam-forman) Funguje jako maplist, ale vrací seznam vzniklý spojením dílčích výsledků pomocí funkce nconc Reprezentace atomů Při grafickém znázornění paměťové reprezentace symbolických výrazů Lispu je odkaz na atom vyjadřován šipkou směřující ke jménu daného atomu. Zdálo by se, že k paměťové reprezentaci symbolického atomu bude stačit uložení příslušné posloupnosti znaků. Jméno je však pouze jednou z tzv. vlastností atomu a každý symbolický atom může mít teoreticky libovolný počet vlastností. Některé z vlastností atomu vyhodnocovací systém Lispu vytváří a využívá automaticky při zpracování programu a takové vlastnosti označujeme jako standardní. Vedle standardních vlastností může uživatel přiřadit atomu libovolné další vlastnosti a využívat je podle vlastní úvahy. To spolu s jednoznačnou reprezentací symbolických atomů v Lispu poskytuje zcela nové programovací možnosti, které tvoří základ pro daty řízené programování a objektově orientované programování. Seznam vlastností atomu K reprezentaci symbolického atomu slouží seznam vlastností atomu (property-list, zkráceně P- seznam), který má následující strukturu: (ind1 hodn1 ind2 hodn2 indn hodnn) kde ind označuje indikátor vlastnosti a hodn její hodnotu. Reprezentace atomu v paměti je tedy obdobná jako reprezentace neatomických S-výrazů a je založena na využití cons-buněk. P- seznam nelze ovšem chápat jako obyčejný seznam, neboť je to vnitřní reprezentace atomu, a pro práci s ním je tedy nutno používat speciální funkce. Struktura reprezentující symbolický atom se vytvoří při prvním výskytu daného atomu v programu nebo v datech, a od té chvíle se každý další výskyt vyjádří odkazem na tuto jedinou reprezentaci. Přestože všechny výskyty daného atomu reprezentuje jediná paměťová struktura, neznamená to, že tato struktura zůstává během výpočtu neměnná. Pro číselné atomy jedinečnost reprezentace neplatí. Protože číselný atom představuje pouze příslušnou číselnou hodnotu, týká se možnost existence různých vlastností pouze symbolických atomů. Příklady standardních vlastností atomů: PNAME hodnotou je řetězec znaků tvořící jméno atomu (print-name). APVAL slouží pro uložení hodnoty navázané na proměnnou

34 EXPR slouží k uložení uživatelské definice funkce; její hodnotou je příslušný lambdavýraz. SUBR slouží k uložení odkazu na funkci ve strojovém kódu. FEXPR charakterizuje atom jako speciální funkci a za hodnotu má příslušnou lambdadefinici. FSUBR charakterizuje atom jako standardní speciální funkci a za hodnotu má odkaz na její realizaci ve strojovém kódu. Tentýž atom může být vázanou proměnnou i jménem funkce a kontext jeho použití rozhoduje, kterou interpretaci systém Lisp zvolí. Vlastnosti EXPR a FEXPR (a ovšem též SUBR a FSUBR) se u jednoho atomu nemohou vyskytovat současně. Funkce pro práci se seznamy vlastností (get atom-forma indikátor-forma) Funkce get má dva argumenty. Hodnotou prvého by měl být atom a hodnotou druhého indikátor vlastnosti (také atom). Tato funkce se používá pro zjištění existence a hodnoty vlastnosti s určeným indikátorem v P-seznamu daného atomu. Pokud tento atom požadovanou vlastnost nemá, je výsledkem nil. (putprop atom-forma hodnota-forma indikátor-forma) Funkce putprop zajistí uložení hodnoty vlastnosti určené indikátorem vlastnosti do P-seznamu daného atomu. Tato funkce vrací ukládanou hodnotu. (remprop atom-forma indikátor-forma) Funkce remprop zajistí vypuštění vlastnosti určené indikátorem (včetně její hodnoty) z P- seznamu daného atomu. Tato funkce vrací nil. Příklady: (putprop 'A '(B C) 'SOUSEDE) (B C) (get 'A 'SOUSEDE) (B C) V jazyku Common Lisp funkce putprop chybí. Vložení hodnoty do seznamu vlastností se zajišťuje pomocí kombinace funkcí setf a get: (setf (get atom-forma indikátor-forma) hodnota-forma)hodnotu vlastnosti můžeme do P-seznamu vložit také pomocí kombinace funkcí setf a get: (setf (get 'B 'SOUSEDE) '(A C D)) (A C D) (get 'B 'SOUSEDE) (A C D) Pomocí seznamů vlastností můžeme implementovat např. grafovou strukturu. Vrcholy (uzly) grafu mohou být reprezentovány atomy a hrany vlastnostmi sousedé (v případě neorientovaných hran) nebo následníci (v případě orientovaných hran). Jiným příkladem použití seznamů vlastností je implementace rámců (frames), které jsou jedním z prostředků reprezentace znalostí v expertních systémech

35 Funkce gensym (gensym) Hodnotou aplikace funkce gensym bez argumentů je vygenerovaný atom. Jeho jméno je tvořeno aktuálně platným prefixem (implicitně G) za nímž následuje aktuální pořadové číslo (na počátku obvykle 0). Po každém volání funkce gensym se pořadové číslo zvětšuje, takže je zaručena různost generovaných atomů. (gensym výraz) Hodnota argumentu určuje jméno generovaného atomu takto: je-li hodnotou symbolický atom (v Common Lispu to musí být řetězec), použije se jako prefix generovaného atomu, je-li hodnotou nezáporné celé číslo, použije se jako pořadové číslo generovaného atomu Vstup a výstup Vstup/výstup z/do standardních zařízení (read) Funkce read přečte ucelený S-výraz a ten vrátí jako výslednou hodnotu. (print výraz) (princ výraz) Tyto funkce zajistí vypsání hodnotu argumentu (zobrazený S-výraz je současně výslednou hodnotou těchto funkcí). Funkce print pak přejde na nový řádek. Funkce print zobrazí hodnotu argumentu ve tvaru, který je zpětně čitelný pomocí funkce read, kdežto funkce princ potlačuje některé speciální znaky. (terpri) Funkce terpri ukončí aktuální řádek a vrátí nil. Příklad: (setq x (read)) (print x) Vstup/výstup z/do souboru (open jméno-souboru) Funkce open zajistí otevření souboru. Jméno souboru je řetězec. Funkce vrací ukazatel na soubor. (close ukazatel-na-soubor) Funkce close zajistí uzavření souboru. Příklad: (setq f (open "C:/adresar/data.txt")) (close f)

36 Výše uvedené funkce read, print, princ, terpri mohou být používány i pro soubory: (read ukazatel-na-soubor) (print výraz ukazatel-na-soubor) (princ výraz ukazatel-na-soubor) (terpri soubor) Aplikace funkce read může mít i takovouto podobu: (read ukazatel-na-soubor eof-error eof-value) Je-li argument eof-error různý od nil, je při dosažení konce souboru (eof) signalizována chyba. Má-li tento argument hodnotu nil, pak je při dosažení konce souboru vrácena hodnota určená argumentem eof-value. Příklad: Výpočet součtu čísel ze zadaného souboru. ; Konec souboru je signalizovan symbolem f (defun secti1 (f) (setq s 0) (do ((x (read f nil f) (read f nil f))) ((eq x f) s) (setq s (+ s x)))) ; Konec souboru je signalizovan symbolem nil (defun secti2 (f) (setq s 0) (do ((x (read f nil nil) (read f nil nil))) Vstup/výstup znaků (read-char) ((null x) s) (setq s (+ s x)))) (read-char ukazatel-na-soubor) (read-char ukazatel-na-soubor eof-error eof-value) Funkce read-char přečte jeden znak a jako výslednou hodnotu vrátí #\znak. (write-char výraz) (write-char výraz ukazatel-na-soubor) Hodnotou výrazu by měl být znak reprezentovaný trojicí #\znak. Funkce write-char zajistí vypsání tohoto znaku (trojice #\znak je současně výslednou hodnotou této funkce)

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ 2011 Jan Janoušek MI-FLP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Page 1 of 6 Cviceni 3 Obsah seznamy, cons-buňka, car, cdr, first,

Více

LISP Definice funkcí

LISP Definice funkcí LISP Definice funkcí (DEFUN jméno-fce (argumenty) tělo-fce ) Přiřadí jménu-fce lambda výraz definovaný tělem-fce, tj. (LAMBDA (argumenty) tělo-fce). Vytvoří funkční vazbu symbolu jméno-fce Struktura symbolu:

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

Funkcionální programování úvod

Funkcionální programování úvod Funkcionální programování úvod Imperativní jazyky založeny na von Neumann architektuře primárním kriteriem je efektivita Modelem je Turingův stroj Základní konstrukcí je příkaz Příkazy mění stavový prostor

Více

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David Úvod do Prologu Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David Warren (Warren Abstract Machine) implementace

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Tečkové páry, symbolická data a kvotování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 4 V. Vychodil (KI, UP Olomouc) Tečkové páry, symbolická data a kvotování

Více

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] Hanojská věž zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah je lepší? (co je lepší tah?) P. Berka, 2012 1/21 Stavový prostor 1. množina stavů S = {s} 2. množina přechodů

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Explicitní aplikace a vyhodnocování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 6 V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška

Více

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p Hanojská věž Stavový prostor 1. množina stavů S = {s} 2. množina přechodů mezi stavy (operátorů) Φ = {φ} s k = φ ki (s i ) zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah

Více

1. Od Scheme k Lispu

1. Od Scheme k Lispu KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI www.inf.upol.cz Michal Krupka krupka.inf.upol.cz michal.krupka@upol.cz 7. listopadu, 77 46 Olomouc Paradigmata programování poznámky k přednášce. Od

Více

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ Slajdy vytvořili Vilém Vychodil a Jan Konečný (KI, UP Olomouc) PP 2, Lekce

Více

Funkcionální programování. Kristýna Kaslová

Funkcionální programování. Kristýna Kaslová Funkcionální programování Kristýna Kaslová Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python)

Více

Logické programování I

Logické programování I Logické programování I PROLOG Program popisuje "svět" Prologu = databáze faktů a pravidel (tzv. klauzulí). fakta: predikát(arg1, arg2,...argn). cíle:?- predikát(arg1, arg2,...argn). pravidla: hlava :-

Více

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí) Programovací jazyky Programovací jazyky nižší assembler (jazyk symbolických instrukcí) vyšší imperativní (procedurální) Pascal, C/C++, Java, Basic, Python, php neimperativní (neprocedurální) Lisp, Prolog

Více

Logika a logické programování

Logika a logické programování Logika a logické programování témata ke zkoušce Poslední aktualizace: 16. prosince 2009 Zkouška je písemná, skládá se obvykle ze sedmi otázek (může být více nebo méně, podle náročnosti otázek), z toho

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

4.2 Syntaxe predikátové logiky

4.2 Syntaxe predikátové logiky 36 [070507-1501 ] 4.2 Syntaxe predikátové logiky V tomto oddíle zavedeme syntaxi predikátové logiky, tj. uvedeme pravidla, podle nichž se tvoří syntakticky správné formule predikátové logiky. Význam a

Více

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí) Programovací jazyky Programovací jazyky nižší assembler (jazyk symbolických instrukcí) vyšší imperativní (procedurální) Pascal, C/C++, Java, Basic, Python, php neimperativní (neprocedurální) Lisp, Prolog

Více

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony. Booleovská algebra. Booleovské binární a unární funkce. Základní zákony. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Vytváření abstrakcí pomocí procedur Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 2 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

popel, glum & nepil 16/28

popel, glum & nepil 16/28 Lineární rezoluce další způsob zjemnění rezoluce; místo stromu směřujeme k lineární struktuře důkazu Lineární rezoluční odvození (důkaz) z Ë je posloupnost dvojic ¼ ¼ Ò Ò taková, že Ò ½ a 1. ¼ a všechna

Více

Základy umělé inteligence

Základy umělé inteligence Základy umělé inteligence Automatické řešení úloh Základy umělé inteligence - prohledávání. Vlasta Radová, ZČU, katedra kybernetiky 1 Formalizace úlohy UI chápe řešení úloh jako proces hledání řešení v

Více

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1 Negativní informace Petr Štěpánek S použitím materiálu M.Gelfonda a V. Lifschitze 2009 Logické programování 15 1 Negace jako neúspěch Motivace: Tvrzení p (atomická formule) neplatí, jestliže nelze odvodit

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

Výroková a predikátová logika - II

Výroková a predikátová logika - II Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2015/2016 1 / 18 Základní syntax Jazyk Výroková logika je logikou

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Kvazikvotování a manipulace se symbolickými výrazy Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 11 V. Vychodil (KI, UP Olomouc) Kvazikvotování, manipulace se

Více

Seminární práce z Teorie ICT

Seminární práce z Teorie ICT ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE Provozně ekonomická fakulta Seminární práce z Teorie ICT Implementace logické hádanky v Prologu Autor : Petr Pechek 1 Popis zvoleného problému Mým úkolem bylo vyřešit

Více

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program Denotační sémantika programovacího jazyka doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 Obsah přednášky Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup

Více

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické

Více

Výroková a predikátová logika - II

Výroková a predikátová logika - II Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2017/2018 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2017/2018 1 / 17 Předběžnosti Základní pojmy n-ární relace a funkce

Více

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ 2011 Jan Janoušek MI-FLP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Page 1 of 5 Lekce 5 Obsah sekvence, sequencep, subseq, reverse,

Více

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem. Algoritmus Algoritmus je schematický postup pro řešení určitého druhu problémů, který je prováděn pomocí konečného množství přesně definovaných kroků. nebo Algoritmus lze definovat jako jednoznačně určenou

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software. Maturitní témata IKT, školní rok 2017/18 1 Struktura osobního počítače Von Neumannova architektura: zakreslete, vysvětlete její smysl a popište, jakým způsobem se od ní běžné počítače odchylují. Osobní

Více

3 Co je algoritmus? 2 3.1 Trocha historie... 2 3.2 Definice algoritmu... 3 3.3 Vlastnosti algoritmu... 3

3 Co je algoritmus? 2 3.1 Trocha historie... 2 3.2 Definice algoritmu... 3 3.3 Vlastnosti algoritmu... 3 Obsah Obsah 1 Program přednášek 1 2 Podmínky zápočtu 2 3 Co je algoritmus? 2 3.1 Trocha historie............................ 2 3.2 Definice algoritmu.......................... 3 3.3 Vlastnosti algoritmu.........................

Více

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v

Více

Výroková logika. Teoretická informatika Tomáš Foltýnek

Výroková logika. Teoretická informatika Tomáš Foltýnek Výroková logika Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz Teoretická informatika strana 2 Opakování z minulé přednášky Co je to formalismus a co je jeho cílem? Formulujte Russelův paradox

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Lekce 01 Úvod do algoritmizace

Lekce 01 Úvod do algoritmizace Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů Lekce 01 Úvod do algoritmizace Tento projekt CZ.1.07/1.3.12/04.0006 je spolufinancován Evropským sociálním

Více

Matematická logika. Rostislav Horčík. horcik

Matematická logika. Rostislav Horčík.    horcik Matematická logika Rostislav Horčík horcik@math.feld.cvut.cz horcik@cs.cas.cz www.cs.cas.cz/ horcik Rostislav Horčík (ČVUT FEL) Y01MLO Letní semestr 2007/2008 1 / 20 Predikátová logika Motivace Výroková

Více

Výroková a predikátová logika - V

Výroková a predikátová logika - V Výroková a predikátová logika - V Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - V ZS 2015/2016 1 / 21 Dokazovací systémy VL Hilbertovský kalkul Hilbertovský

Více

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat IB015 Neimperativní programování Organizace a motivace kurzu, programovací jazyk Haskell Jiří Barnat Sekce IB015 Neimperativní programování 01 str. 2/36 Organizace kurzu Cíle kurzu IB015 Neimperativní

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

PODPROGRAMY PROCEDURY A FUNKCE

PODPROGRAMY PROCEDURY A FUNKCE PODPROGRAMY PROCEDURY A FUNKCE Programy bez podprogramů Příklady: a) Napište program, který na obrazovku nakreslí čáru složenou ze znaků pomlčka. program Cara; b) Napište program, který na obrazovku nakreslí

Více

Modely Herbrandovské interpretace

Modely Herbrandovské interpretace Modely Herbrandovské interpretace Petr Štěpánek S využitím materialu Krysztofa R. Apta 2006 Logické programování 8 1 Uvedli jsme termové interpretace a termové modely pro logické programy a také nejmenší

Více

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace Číslo projektu Číslo materiálu Autor Průřezové téma Předmět CZ.1.07/1.5.00/34.0565 VY_32_INOVACE_284_Programovací_jazyky

Více

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek Otázka 06 - Y01MLO Zadání Predikátová logika, formule predikátové logiky, sentence, interpretace jazyka predikátové logiky, splnitelné sentence, tautologie, kontradikce, tautologicky ekvivalentní formule.

Více

Výroková a predikátová logika - II

Výroková a predikátová logika - II Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2013/2014 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2013/2014 1 / 20 Základní syntax Jazyk Výroková logika je logikou

Více

Logika. 2. Výroková logika. RNDr. Luděk Cienciala, Ph. D.

Logika. 2. Výroková logika. RNDr. Luděk Cienciala, Ph. D. Logika 2. Výroková logika RNDr. Luděk Cienciala, Ph. D. Tato inovace předmětu Úvod do logiky je spolufinancována Evropským sociálním fondem a Státním rozpočtem ČR, projekt č. CZ. 1.07/2.2.00/28.0216, Logika:

Více

Struktura programu v době běhu

Struktura programu v době běhu Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů

Více

Přednáška 3. Rekurze 1

Přednáška 3. Rekurze 1 Paradigmata programování 1 Přednáška 3. Rekurze 1 Michal Krupka KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Obsah 1 Příklady 2 Rekurzivní procedury a rekurzivní výpočetní proces 3 Další příklady

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

Paradigmata programování 2

Paradigmata programování 2 Paradigmata programování 2 6. cvičení Radek Janoštík Univerzita Palackého v Olomouci 18.3.2019 Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 1 / 11 Vedlejší efekt

Více

Výroková logika - opakování

Výroková logika - opakování - opakování ormální zavedení Výroková formule: Máme neprázdnou nejvýše spočetnou množinu A výrokových proměnných. 1. Každá proměnná je výroková formule 2. Když α, β jsou formule, potom ( α), (α β), (α

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

Více

Predikátová logika. prvního řádu

Predikátová logika. prvního řádu Predikátová logika prvního řádu 2 Predikát Predikát je n-ární relace - vyjadřuje vlastnosti objektů a vztahy mezi objekty - z jednoduchého výroku vznikne vypuštěním alespoň jednoho jména objektu (individua)

Více

5 Orientované grafy, Toky v sítích

5 Orientované grafy, Toky v sítích Petr Hliněný, FI MU Brno, 205 / 9 FI: IB000: Toky v sítích 5 Orientované grafy, Toky v sítích Nyní se budeme zabývat typem sít ových úloh, ve kterých není podstatná délka hran a spojení, nýbž jejich propustnost

Více

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model Databázové systémy Tomáš Skopal - relační model * relační kalkuly Osnova přednášky relační kalkuly doménový n-ticový Relační kalkuly využití aparátu predikátové logiky 1. řádu pro dotazování rozšíření

Více

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5 Obsah Obsah 1 Řídicí struktury 1 2 Podmínka 1 2.1 Podmínka typu case......................... 2 3 Příkaz skoku 3 4 Cykly 4 4.1 Cyklus s podmínkou na začátku................... 4 4.2 Cyklus s podmínkou

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento

Více

Programování v čistém Prologu

Programování v čistém Prologu Programování v čistém Prologu Petr Štěpánek S využitím materiálu Krysztofa R. Apta 2006 Logické programování 9 1 Ukázali jsme, že logické programy mohou sloužit k výpočtům. Volně řečeno, logiské programz

Více

Prohledávání do šířky = algoritmus vlny

Prohledávání do šířky = algoritmus vlny Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé

Více

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)

Více

teorie logických spojek chápaných jako pravdivostní funkce

teorie logických spojek chápaných jako pravdivostní funkce Výroková logika teorie logických spojek chápaných jako pravdivostní funkce zabývá se způsoby tvoření výroků pomocí spojek a vztahy mezi pravdivostí různých výroků používá specifický jazyk složený z výrokových

Více

NPRG030 Programování I, 2016/17 1 / :58:13

NPRG030 Programování I, 2016/17 1 / :58:13 NPRG030 Programování I, 2016/17 1 / 31 10. 10. 2016 10:58:13 Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE NPRG030 Programování

Více

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu. Přednáška 7 Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu. 1 Příkaz expr výraz Celočíselná aritmetika I Zašle na standardní výstup vyhodnocení výrazu

Více

Formální systém výrokové logiky

Formální systém výrokové logiky Formální systém výrokové logiky 1.Jazyk výrokové logiky Nechť P = {p,q,r, } je neprázdná množina symbolů, které nazýváme prvotní formule. Symboly jazyka L P výrokové logiky jsou : a) prvky množiny P, b)

Více

Matematická logika. Miroslav Kolařík

Matematická logika. Miroslav Kolařík Matematická logika přednáška desátá Miroslav Kolařík Zpracováno dle textu R. Bělohlávka: Matematická logika poznámky k přednáškám, 2004. Obsah 1 Úvod do modální logiky 2 Logické programování a Prolog 3

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Lisp 7-1. opakování destruktivních změn seznamů

Lisp 7-1. opakování destruktivních změn seznamů Lisp 7-1 opakování destruktivních změn seznamů Seznam bez posledního prvku - destruktivně: ;velmi důležité si uvědomit jak to funguje.. zejména návratová hodnota funkce (defun bez_posledniho(s ((null (cdr

Více

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY VÝVOJ TOHOTO UČEBNÍHO MATERIÁLU JE SPOLUFINANCOVÁN EVROPSKÝM

Více

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace Vektory a matice Aplikovaná matematika I Dana Říhová Mendelu Brno Obsah 1 Vektory Základní pojmy a operace Lineární závislost a nezávislost vektorů 2 Matice Základní pojmy, druhy matic Operace s maticemi

Více

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -

Více

Da D to t v o é v ty t py IB111: Datové typy

Da D to t v o é v ty t py IB111: Datové typy Datové typy IB111: Datové typy Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji provádět? Navržení práce s daty je velice důležité

Více

Rekurzivní algoritmy

Rekurzivní algoritmy Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS

Více

Program a životní cyklus programu

Program a životní cyklus programu Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy

Více

NPRG030 Programování I, 2010/11

NPRG030 Programování I, 2010/11 Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE když X, Y jsou (číselné) výrazy, potom X = Y X Y X < Y X > Y X = Y jsou

Více

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23 Výroková logika Alena Gollová Výroková logika 1/23 Obsah 1 Formule výrokové logiky 2 Alena Gollová Výroková logika 2/23 Formule výrokové logiky Výrok je oznamovací věta, o jejíž pravdivosti lze rozhodnout.

Více

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost Programování Algoritmus návod na vykonání činnosti, který nás od (měnitelných) vstupních dat přivede v konečném čase k výsledku přesně definovaná konečná posloupnost činností vedoucích k výsledku (postup,

Více

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5 Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5

Více

Datové struktury 2: Rozptylovací tabulky

Datové struktury 2: Rozptylovací tabulky Datové struktury 2: Rozptylovací tabulky prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy

Více

Matematická logika. Miroslav Kolařík

Matematická logika. Miroslav Kolařík Matematická logika přednáška šestá Miroslav Kolařík Zpracováno dle textu R. Bělohlávka: Matematická logika poznámky k přednáškám, 2004. a dle učebního textu R. Bělohlávka a V. Vychodila: Diskrétní matematika

Více

platné nejsou Sokrates je smrtelný. (r) 1/??

platné nejsou Sokrates je smrtelný. (r) 1/?? Predikátová logika plně přejímá výsledky výrokové logiky zabývá se navíc strukturou jednotlivých jednoduchých výroků na základě této analýzy lze odvodit platnost některých výroků, které ve výrokové logice

Více

IB112 Základy matematiky

IB112 Základy matematiky IB112 Základy matematiky Řešení soustavy lineárních rovnic, matice, vektory Jan Strejček IB112 Základy matematiky: Řešení soustavy lineárních rovnic, matice, vektory 2/53 Obsah Soustava lineárních rovnic

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou

Více

Programovací jazyk Prolog

Programovací jazyk Prolog Programovací jazyk Prolog Logické programování Šárka Vavrečková Ústav informatiky, Filozoficko-přírodovědecká fakulta Slezské univerzity v Opavě sarka.vavreckova@fpf.slu.cz 1. prosince 2008 Prolog Co je

Více

Assembler - 5.část. poslední změna této stránky: Zpět

Assembler - 5.část. poslední změna této stránky: Zpět 1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají

Více

Algoritmizace. Obrázek 1: Přeložení programu překladačem

Algoritmizace. Obrázek 1: Přeložení programu překladačem Algoritmizace V každém okamžiku ví procesor počítače přesně, co má vykonat. Pojmem procesor se v souvislosti s algoritmy označuje objekt (např. stroj i člověk), který vykonává činnost popisovanou algoritmem.

Více

Úvod do informatiky. Miroslav Kolařík

Úvod do informatiky. Miroslav Kolařík Úvod do informatiky přednáška první Miroslav Kolařík Zpracováno dle učebního textu prof. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008. Obsah 1 Co a k čemu je logika? 2 Výroky a logické spojky

Více

Tabulkový procesor. Základní rysy

Tabulkový procesor. Základní rysy Tabulkový procesor Tabulkový procesor je počítačový program zpracovávající data uložená v buňkách tabulky. Program umožňuje použití vzorců pro práci s daty a zobrazuje výsledné hodnoty podle vstupních

Více

Algoritmizace. 1. Úvod. Algoritmus

Algoritmizace. 1. Úvod. Algoritmus 1. Úvod Algoritmizace V dnešní době již počítače pronikly snad do všech oblastí lidské činnosti, využívají se k řešení nejrůznějších úkolů. Postup, který je v počítači prováděn nějakým programem se nazývá

Více