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



Podobné dokumenty
LISP Definice funkcí

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

Funkcionální programování úvod

Jazyky pro umělou inteligenci

Paradigmata programování II Přednáška 2: Mutace

Paradigmata programování 1

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

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

Paradigmata programování 1

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

CO MATE ZA NOVÉ PROGRAMY?

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]

1. Od Scheme k Lispu

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


Paradigmata programování 2

Paradigmata programování 1

Paradigmata programování II Přednáška 1: Vedlejší efekt

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Paradigmata programování II Korutiny a nedeterminismus

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

Paradigmata programování 1

Paradigmata programování II Přednáška 6: Líné vyhodnocování, proudy a kešované vyhodnocování

( ) Kreslení grafů funkcí metodou dělení definičního oboru I. Předpoklady: 2401, 2208

Popis a funkce klávesnice Gama originální anglický manuál je nedílnou součástí tohoto českého překladu

Preddefinované premenné: PI Ludolfovo číslo ( ) t Konštanta = TRUE PAUSE = \\ = Pauza pre vstup užívateľa FUNKCIE:

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ

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

Lokální definice (1) plocha-kruhu

Úvod do programování v CAD

Dualita v úlohách LP Ekonomická interpretace duální úlohy. Jiří Neubauer. Katedra ekonometrie FEM UO Brno

Funkcionální programování Scheme

Analýza dat a modelování. Přednáška 3

Funkcionální programování Scheme

Programování 4. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

PG 9.5 novinky ve vývoji aplikací

1. Programování, typy programovacích jazyků, historie.

16. února 2015, Brno Připravil: David Procházka

KMI/PRCL. FORMAT, LOOP, packages, QuickLoad

PARADIGMATA OBJEKTOVÉHO PROGRAMOVÁNÍ I

Funkcionální programování

INFORMATIKA WORD 2007

Expertní Systémy. Umělá inteligence Alan Turing: Computing Machinery and Intelligence. Mind 59, 1950, s

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Záloha a obnovení Uživatelská příručka

Operace na datových strukturách

SQL tříhodnotová logika

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

očekávaný výstup Člověk a příroda 2. stupeň P znát základní funkce hlavních orgánů a orgánových soustav rostlin i živočichů ročník 6. č.

JAK PŘIDAT UŽIVATELE PRO ADMINISTRÁTORY

Operace na datových strukturách

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Obsah. 1. PicoLisp: dokončení popisu a několik praktických rad na závěr. 2. Použití

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Lineární datové struktury

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Advance Design 2013 / SP1

Zoner photo studio část

Geometrické vektory. Martina Šimůnková. Katedra aplikované matematiky. 9. března 2008

Hranolový spektrometr

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

NEDĚLE Svátek sv. Rodiny Obnova manželských slibů PONDĚLÍ 6. den v oktávu Narození Páně. 8:30 Troubky

Opakování podstatných jmen

pracovní list Anorganická chemie Halogeny Mgr. Alexandra Šlegrová

Tvorba trendové funkce a extrapolace pro roční časové řady

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

V týmové spolupráci jsou komentáře nezbytností. V komentářích se může např. kolega vyjadřovat k textu, který jsme napsali atd.

KIV/ZIS cvičení 5. Tomáš Potužák

PC, POWER POINT, dataprojektor

Strava během dne 1.) 2.) Anketa pro 8. ročník. Snídáte pravidelně: A.) Ano B.) Někdy C.) Ne. Odpovědi: V procentech:

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

DUM téma: KALK Výrobek sestavy

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Algoritmizace prostorových úloh

Interpretace Dantova Pekla

POSLECH. M e t o d i c k é p o z n á m k y k z á k l a d o v é m u t e x t u:

Pokročilé funkce a časté chyby. Petr Ferschmann FlexiBee Systems s.r.o.

Výukový materiál zpracovaný v rámci projektu Výuka moderně

Windows 10 (6. třída)

3.1 Výběrové dotazy z jedné tabulky

Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU MS POWERPOINT 2010

ŘÍZENÍ FYZIKÁLNÍHO PROCESU POČÍTAČEM

Biologie člověka nervová soustava kvarteto

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Seznámení se shellem, textové editory numerické výpočty

Ročník: 1. Mgr. Jan Zmátlík Zpracováno dne:

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

1.3.1 Kruhový pohyb. Předpoklady: 1105

Prolog 1-1. Rodinné vztahy pomocí Prologu:

Semestrální práce k předmětu Konstruování s podporou PC Ing. Pavel Vrecion

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

RÁDIO KAZETOVÝ PŘEHRÁVAČ S CD

(pracovní verze textu určená pro studenty)

Transkript:

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 s nil ((null (cdr (cdr s (rplacd s nil s (t (bez_posledniho (cdr s s (bez_posledniho s s -> (a b c Přidá prvek na konec seznamu: (defun pridat_na_konec(a s (rplacd (last s (cons a nil s (pridat_na_konec 'e s -> (a b c d e s -> (a b c d e ;návratová hodnota funkce Rotace seznamu doleva: (defun rotace_doleva(s (t (pridat_na_konec (car s s ;změna seznamu (cdr s ;návratová hodnota funkce (rotace_doleva s -> (b c d a s -> (a b c d a (defun rotace_doleva2(s (t (pridat_na_konec (car s s ;1. změna seznamu (rplaca s (cadr s ;2. změna seznamu (rplacd s (cddr s ;3. změna seznamu s ;návratová hodnota (rotace_doleva2 s -> (b c d a s -> (b c d a

Lisp 7-2 Rotace seznamu doprava: (defun rotace_doprava(s (t (let ((posledni (last s (bez_posledniho (bez_posledniho s (cons (car posledni bez_posledniho (rotace_doprava s -> (d a b c s -> (a b c (defun rotace_doprava2(s (t (let ((posledni (last s (bez_posledniho s (let ((nova_bunka (cons (car s (cdr s (rplaca s (car posledni (rplacd s nova_bunka s (rotace_doprava2 s -> (d a b c s -> (d a b c Vložení prvku do seznamu na danou pozici: (defun insert(prvek index seznam (cond ((zerop index (let ((nova_bunka (cons (car seznam (cdr seznam (rplaca seznam prvek (rplacd seznam nova_bunka ((eql index 1 (let ((nova_bunka (cons prvek (cdr seznam (rplacd seznam nova_bunka ((null seznam nil (t (insert prvek (- index 1 (cdr seznam (insert 'e 2 s s -> (a b e c d (insert 'e 4 s s -> (a b c d e (insert 'e 0 s s -> (e a b c d

Lisp 7-3 Obrácení pořadí prvků v seznamu - destruktivně uvnitř: (defun obrat(s (obrat2 s nil Obrácení pořadí prvků v seznamu - destruktivně i navenek: (defun obrat_seznam(s (let ((obraceny (obrat2 (cons (car s (cdr s nil (rplaca s (car obraceny (rplacd s (cdr obraceny (defun obrat2(zdroj druhy (cond ((null zdroj druhy (t (let ((zbytek (cdr zdroj (rplacd zdroj druhy (obrat2 zbytek zdroj (obrat s -> (d c b a s -> a (obrat_seznam s -> (d c b a s -> (d c b a Substituce: a 1.výskytu v jednoúrovňovém (lineárním seznamu b vech výskytů v jednoúrovňovém (lineárním seznamu c vech výskytů ve víceúrovňovém seznamu d 1.výskytu ve víceúrovňovém seznamu (defun substituce1(a b s ((equal a (car s (rplaca s b (t (substituce1 a b (cdr s (setq s '((a b a (c (d a a (substituce1 'a 'b s -> (b (c (d a a ;na návratovou hodnotu jsme nijak nehráli s -> ((a b b (c (d a a (defun substituce2(a b s ((equal a (car s (rplaca s b (substituce2 a b (cdr s (t (substituce2 a b (cdr s (setq s '((a b a (c (d a a (substituce2 'a 'b s -> nil ;na návratovou hodnotu jsme nijak nehráli s -> ((a b b (c (d a b

Lisp 7-4 (defun substituce3(a b s ((equal a (car s (rplaca s b (substituce3 a b (cdr s ((listp (car s (substituce3 a b (car s (substituce3 a b (cdr s (t (substituce3 a b (cdr s (setq s '((a b a (c (d a a (substituce3 'a 'b s -> nil s -> ((b b b (c (d b b (defun substituce4 (a b s (declare (special first (setq first t (substituce4_1 'first a b s (defun substituce4_1 (first a b s ((and (equal a (car s (eval first (set first nil (rplaca s b (substituce4_1 first a b (cdr s ((listp (car s (substituce4_1 first a b (car s (substituce4_1 first a b (cdr s (t (substituce4_1 first a b (cdr s (setq s '((a b a (c (d a a (substituce4 'a 'b s -> nil s -> ((b b a (c (d a a Odstranit: a 1.výskyt v jednoúrovňovém (lineárním seznamu b vechny výskyty v jednoúrovňovém (lineárním seznamu c vechny výskyty ve víceúrovňovém seznamu d 1.výskyt ve víceúrovňovém seznamu (defun odstranit1(a s ((and (equal a (car s (null (cdr s nil ((equal a (car s (let ((nova_bunka (cons (cadr s (cddr s (rplaca s (car nova_bunka (rplacd s (cdr nova_bunka s ((equal a (cadr s (rplacd s (cddr s s (t (odstranit1 a (cdr s s

Lisp 7-5 (setq s '(a (a b a (c (d a a (odstranit1 'a s -> ((a b a (c (d a a s -> ((a b a (c (d a a (setq s '(a (odstranit1 'a s -> nil s -> (a (defun odstranit2(a s ((equal a (car s (odstranit2 a (cdr s ((equal a (cadr s (rplacd s (cddr s (odstranit2 a (cdr s s (t (odstranit2 a (cdr s s (setq s '(a (a b a (c (d a a (odstranit2 'a s -> ((a b (c (d a (defun odstranit2_1(a s ((equal a (car s (odstranit2_1 a (cdr s ((equal a (cadr s (rplacd s (odstranit2_1 a (cddr s s (t (rplacd s (odstranit2_1 a (cdr s s (setq s '(a (a b a (c (d a a (odstranit2_1 'a s -> ((a b (c (d a (defun odstranit3(a s ((listp (car s (rplaca s (odstranit3 a (car s (rplacd s (odstranit3 a (cdr s ((and (equal a (car s (null (cdr s nil ((equal a (car s (rplaca s (cadr s (rplacd s (cddr s (odstranit3 a s s (t (rplacd s (odstranit3 a (cdr s s (defun odstranit3(a s ((equal a (car s (odstranit3 a (cdr s ((listp (car s (rplaca s (odstranit3 a (car s (cond ((equal a (cadr s (rplacd s (odstranit3 a (cddr s s (t (rplacd s (odstranit3 a (cdr s s (t (rplacd s (odstranit3 a (cdr s s

Lisp 7-6 (setq s '(a (a b a (c (d a a (odstranit3 'a s -> ((b (c (d (defun odstranit4 (a s (declare (special first (setq first t (odstranit4_1 'first a s (defun odstranit4_1 (first a s ((and (equal a (car s (eval first (set first nil (cdr s ((listp (car s (rplaca s (odstranit4_1 first a (car s (cond ((and (equal a (cadr s (eval first (set first nil (rplacd s (cddr s s (t (rplacd s (odstranit4_1 first a (cdr s (t (rplacd s (odstranit4_1 first a (cdr s s (setq s '((a b a (c (d a a (odstranit4 'a s -> ((b a (c (d a a (setq s '(a (a b a (c (d a a (odstranit4 'a s -> ((a b a (c (d a a (setq s '((b c d (c (d a a (odstranit4 'a s -> ((b c d (c (d a (setq s '(b c a (c (d a a (odstranit4 'a s -> (b c (c (d a a Aplikace nad strukturovanými seznami Seznam rodičů: reprezentace: (jmeno matka otec (defun jmeno(zaznam (car zaznam (defun matka(zaznam (cadr zaznam (defun otec(zaznam (caddr zaznam (defun rodice(zaznam (cdr zaznam (defun vytvor(jmeno matka otec (list jmeno matka otec

Lisp 7-7 Vrátí rodiče k danému jménu: (defun najdi_rodice(jm seznam (declare (special jm (mapcan '(lambda(zaznam (cond ((eq jm (jmeno zaznam (rodice zaznam (t nil seznam (setq seznam_rodicu '((jan dana zdenek (dana jirina antonin (milos jirina antonin (petr milos jitka (marek zdenek petra (martina dana michal (najdi_rodice 'petr seznam_rodicu -> (milos jitka Najde všechny babicky: (defun babicky(jm seznam (let ((rod (najdi_rodice jm seznam (cond ((null rod nil (t (mapcan '(lambda (x (cond ((null x nil ((list (car x (list (najdi_rodice (car rod seznam (najdi_rodice (cadr rod seznam (babicky 'jan seznam_rodicu -> (jirina Najde všechny dědečky: (defun dedecci(jm seznam (let ((rod (najdi_rodice jm seznam (cond ((null rod nil (t (append (cdr (najdi_rodice (car rod seznam (cdr (najdi_rodice (cadr rod seznam (dedecci 'jan seznam_rodicu -> (antonin Najde všechny předky: (defun predci(jm seznam (let ((rod (najdi_rodice jm seznam (cond ((null rod nil (t (append rod (predci (car rod seznam (predci (cadr rod seznam ; (predci 'jan seznam_rodicu -> (DANA ZDENEK JIRINA ANTONIN ; (predci 'petr seznam_rodicu -> (MILOS JITKA JIRINA ANTONIN

Lisp 7-8 Najde vechny vlastní sourozence: (defun sourozenci(jm seznam (declare (special jm (let ((rod (najdi_rodice jm seznam (declare (special rod (cond ((null rod nil (t (mapcan '(lambda(zaznam (cond ((and (equal rod (rodice zaznam (not (equal jm (jmeno zaznam (list (jmeno zaznam (t nil seznam (sourozenci 'jan seznam_rodicu -> nil (sourozenci 'dana seznam_rodicu -> (milos (sourozenci 'milos seznam_rodicu -> (dana Najde i nevlastní sourozence: (defun sourozenci2(jm seznam (declare (special jm (let ((rod (najdi_rodice jm seznam (declare (special rod (cond ((null rod nil (t (mapcan '(lambda(zaznam (cond ((and (or (member (car rod (rodice zaznam (member (cadr rod (rodice zaznam (not (equal jm (jmeno zaznam (list (jmeno zaznam (t nil seznam (sourozenci 'jan seznam_rodicu -> nil (sourozenci2 'jan seznam_rodicu -> (marek martina (sourozenci2 'dana seznam_rodicu -> (milos (sourozenci2 'milos seznam_rodicu -> (dana Vrátí jméno k daným rodičům: (defun najdi_jmeno(rod seznam (declare (special rod (mapcan '(lambda(zaznam (cond ((equal rod (rodice zaznam (list (jmeno zaznam (t nil seznam

Lisp 7-9 Zplošti seznam: (defun zplosti(s ((atom s s ((atom (car s (cons (car s (zplosti (cdr s (t (append (zplosti (car s (zplosti (cdr s (defun zplosti2(s (mapcan '(lambda(a (cond ((atom a (list a (t (zplosti2 a s (zplosti '(a ((b c d (e (f -> (a b c d e f (zplosti2 '(a ((b c d (e (f -> (a b c d e f Vlastnosti symbolických atomů - jméno atomu je pouze jednou z jeho možných vlastností, patří mezi standardní vlastnosti - každému sybolickému atomu můžeme přidat libovolný počet dalších vlastností - reprezentace vlastností - objet pomocí zřetězeného seznamu cons-buněk - seznam vlastnostní seznamu nelze chápat jako obyčejný seznam, neboť je součástí vnitřní reprezentace atomu - vlastnosti tvoří základ pro programy řízené daty a objektové programování v Lispu (put atom vlastnost hodnota.. nastavení hodnoty (get atom vlastnost.. získání hodnoty (remprop atom vlastnost.. zrušení vlastnosti (symbol-plist symbol.. seznam vlastností a jejich hodnot (symbol-plist 'a -> nil (get 'a 'vl1 -> nil (put 'a 'vl1 1 (symbol-plist 'a -> (vl1 1 (put 'a 'vl2 2 (symbol-plist 'a -> (vl2 2 vl1 1 (get 'a 'vl1 -> 1 (remprop 'a 'vl1 -> t (get 'a 'vl1 -> nil (symbol-plist 'a -> (vl2 2

Lisp 7-10 Seznam rodičů pomocí vlastností: (put 'jan 'rodice '(dana zdenek (put 'dana 'rodice '(jirina antonin (put 'milos 'rodice '(jirina antonin (put 'petr 'rodice '(milos jitka (put 'marek 'rodice '(zdenek petra (put 'martina 'rodice '(dana michal (defun najdi_rodice(jm (get jm 'rodice (defun predci(jm (let ((rod (najdi_rodice jm (cond ((null rod nil (t (append rod (predci (car rod (predci (cadr rod (predci 'jan -> (DANA ZDENEK JIRINA ANTONIN Asociativní vyhledávání - assoc v seznamu vyhledá podseznam pod car prvku (assoc 'elf '( (a 0 1 (b d x 3 x (elf 23 alfa -> (elf 23 alfa