Operace na datových strukturách

Podobné dokumenty
Operace na datových strukturách

klauzulí deklarativní (specifikace programu je přímo programem) popel, glum & nepil 1/18

Práce se seznamy. Operace na datových strukturách. Práce se seznamy del a insert. Práce se seznamy member. Seznam: rekurzivní datová struktura

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

Logické programování I

Složitější domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

Základní datové struktury III: Stromy, haldy

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Stromy, haldy, prioritní fronty

ADT STROM Lukáš Foldýna

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Úvod do teorie grafů

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Prioritní fronta, halda

Datové struktury Úvod

Algoritmizace prostorových úloh

a) b) c) Radek Mařík

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Radomíra Duží L Datový typ množina

Programovací jazyk Prolog

Základy umělé inteligence

Algoritmy na ohodnoceném grafu

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Algoritmizace prostorových úloh

4EK311 Operační výzkum. 5. Teorie grafů

ALGORITMY A DATOVÉ STRUKTURY

Kostry. 9. týden. Grafy. Marie Demlová (úpravy Matěj Dostál) 16. dubna 2019

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

Programování v C++ 1, 16. cvičení

Algoritmy a datové struktury

TGH07 - Chytré stromové datové struktury

Základní datové struktury

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

NPRG030 Programování I, 2018/19 1 / :03:07

Datové typy a struktury

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

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

Implementace slovníku bitovým vektorem

TGH07 - Chytré stromové datové struktury

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

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda

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

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

TGH12 - Problém za milion dolarů

Jan Březina. 7. března 2017


Algoritmizace a programování

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Drsná matematika III 10. demonstrovaná cvičení Kostry grafů

Semestrální práce 2 znakový strom

Analýza Petriho sítí. Analýza Petriho sítí p.1/28

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

Použití dalších heuristik

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

u odpovědí typu A, B, C, D, E: Obsah: jako 0) CLP Constraint Logic Programming

Přijímací zkouška - matematika

TGH05 - Problém za milion dolarů.

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

Zadání k 2. programovacímu testu

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

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

Složitosti základních operací B + stromu

Stromy. Jan Hnilica Počítačové modelování 14

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2014

Úvod do informatiky. Miroslav Kolařík

Postupy práce se šablonami IS MPP

Základní pojmy teorie grafů [Graph theory]

Programování v Pythonu

Dynamické datové struktury III.

TGH05 - aplikace DFS, průchod do šířky

Úvod do informatiky. Miroslav Kolařík

Programování v Pythonu

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

H {{u, v} : u,v U u v }

Obsah: Problém osmi dam

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Kombinatorika, výpočty


Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Vzdálenost uzlů v neorientovaném grafu

Teorie grafů. zadání úloh. letní semestr 2008/2009. Poslední aktualizace: 19. května First Prev Next Last Go Back Full Screen Close Quit

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Maturitní téma: Programovací jazyk JAVA

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

07 Základní pojmy teorie grafů

Dynamické datové struktury IV.

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od jara 2016

4.2 Syntaxe predikátové logiky

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Dynamické datové struktury I.

Transkript:

Aleš Horák E-mail: hales@fi.muni.cz http://nlp.fi.muni.cz/uui/ Obsah: Operace na datových strukturách Binární stromy Reprezentace grafů Úvod do umělé inteligence 2/12 1 / 26

Operace na datových strukturách Seznam: rekurzivní datová struktura uspořádaná posloupnost prvků (libovolných termů včetně seznamů) operátor./2; prázdný seznam [].(Hlava,Tělo), alternativně [Hlava Tělo], Hlava je (typu) prvek seznamu, Tělo je (typu) seznam.(a,[]) [a] [a []].(a,.(b,.(c,[]))) [a,b,c] [a,b [c]], [a [b,c]], [a,b,c []], [a [b,c []]], [a [b [c []]]].(a,.(.(b,.(c,[])),[])) [a,[b,c]] [a [[b,c]]],...... [a1,[[b3,c3],d2,e2],f1]... Úvod do umělé inteligence 2/12 2 / 26

Operace na datových strukturách Seznam: rekurzivní datová struktura uspořádaná posloupnost prvků (libovolných termů včetně seznamů) operátor./2; prázdný seznam [].(Hlava,Tělo), alternativně [Hlava Tělo], Hlava je (typu) prvek seznamu, Tělo je (typu) seznam.(a,[]) [a] [a []].(a,.(b,.(c,[]))) [a,b,c] [a,b [c]], [a [b,c]], [a,b,c []], [a [b,c []]], [a [b [c []]]].(a,.(.(b,.(c,[])),[])) [a,[b,c]] [a [[b,c]]],...... [a1,[[b3,c3],d2,e2],f1]... Úvod do umělé inteligence 2/12 2 / 26

Operace na datových strukturách Seznam: rekurzivní datová struktura uspořádaná posloupnost prvků (libovolných termů včetně seznamů) operátor./2; prázdný seznam [].(Hlava,Tělo), alternativně [Hlava Tělo], Hlava je (typu) prvek seznamu, Tělo je (typu) seznam.(a,[]) [a] [a []].(a,.(b,.(c,[]))) [a,b,c] [a,b [c]], [a [b,c]], [a,b,c []], [a [b,c []]], [a [b [c []]]].(a,.(.(b,.(c,[])),[])) [a,[b,c]] [a [[b,c]]],...... [a1,[[b3,c3],d2,e2],f1]... Úvod do umělé inteligence 2/12 2 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]). X=a Yes 2. member(x,[y _]) :- X == Y. member(x,[_ T]) :- member(x,t).?- member(a,[x,b,c]).?- member(a,[a,b,a]),write(ok),nl,fail. ok ok 3. member(x,[y _]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).?- member(a,[a,b,a]),write(ok),nl,fail. ok Úvod do umělé inteligence 2/12 3 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(_,[],[]).?- del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes?- del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).?- insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; Úvod do umělé inteligence 2/12 4 / 26

permutace 1. pomocí insert perm1([],[]).?- perm1([1,2,3],l). perm1([h T],L):- perm1(t,v), insert(h,v,l). L = [1, 2, 3] ; L = [2, 1, 3] ; L = [2, 3, 1] ; L = [1, 3, 2] ; L = [3, 1, 2] ; L = [3, 2, 1] ; 2. pomocí del1 perm2([],[]). perm2(l,[x P]) :- del1(x,l,l1),perm2(l1,p). 3. pomocí append perm3([],[]). perm3(l,[h T]):- append(a,[h B],L),append(A,B,L1), perm3(l1,t). Úvod do umělé inteligence 2/12 5 / 26

permutace 1. pomocí insert perm1([],[]).?- perm1([1,2,3],l). perm1([h T],L):- perm1(t,v), insert(h,v,l). L = [1, 2, 3] ; L = [2, 1, 3] ; L = [2, 3, 1] ; L = [1, 3, 2] ; L = [3, 1, 2] ; L = [3, 2, 1] ; 2. pomocí del1 perm2([],[]). perm2(l,[x P]) :- del1(x,l,l1),perm2(l1,p). 3. pomocí append perm3([],[]). perm3(l,[h T]):- append(a,[h B],L),append(A,B,L1), perm3(l1,t). Úvod do umělé inteligence 2/12 5 / 26

permutace 1. pomocí insert perm1([],[]).?- perm1([1,2,3],l). perm1([h T],L):- perm1(t,v), insert(h,v,l). L = [1, 2, 3] ; L = [2, 1, 3] ; L = [2, 3, 1] ; L = [1, 3, 2] ; L = [3, 1, 2] ; L = [3, 2, 1] ; 2. pomocí del1 perm2([],[]). perm2(l,[x P]) :- del1(x,l,l1),perm2(l1,p). 3. pomocí append perm3([],[]). perm3(l,[h T]):- append(a,[h B],L),append(A,B,L1), perm3(l1,t). Úvod do umělé inteligence 2/12 5 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:?- append([a,b],[c,d],l). L = [a, b, c, d] Yes?- append(x,[c,d],[a,b,c,d]). X = [a, b] Yes?- append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; Úvod do umělé inteligence 2/12 6 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

využití append predikát append je všestranně použitelný: member(x,ys) :- append(as,[x Xs],Ys). last(x,xs) :- append(as,[x],xs). prefix(xs,ys) :- append(xs,as,ys). suffix(xs,ys) :- append(as,xs,ys). sublist(xs,asxsbs) :- append(asxs,bs,asxsbs), append(as,xs,asxs). adjacent(x,y,zs) :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 26

efektivita append Efektivní řešení predikátu append rozdílové seznamy (difference lists) Rozdílový seznam se zapisuje jako Seznam1-Seznam2. Např.: [a,b,c]... [a,b,c] - [] nebo [a,b,c,d] - [d] nebo [a,b,c,d,e] - [d,e], obecně [a,b,c X] - X []... A-A [a]... [a A]-A Seznam2 jako volná proměnná slouží jako ukazatel na konec seznamu Seznam1 predikát append s rozdílovými seznamy (append dl): append_dl(a-b,b-c,a-c).?- append_dl([a,b X]-X,[c,d Y]-Y,Z). X = [c, d Y] Y = Y Z = [a, b, c, d Y] - Y Yes Úvod do umělé inteligence 2/12 8 / 26

efektivita append Efektivní řešení predikátu append rozdílové seznamy (difference lists) Rozdílový seznam se zapisuje jako Seznam1-Seznam2. Např.: [a,b,c]... [a,b,c] - [] nebo [a,b,c,d] - [d] nebo [a,b,c,d,e] - [d,e], obecně [a,b,c X] - X []... A-A [a]... [a A]-A Seznam2 jako volná proměnná slouží jako ukazatel na konec seznamu Seznam1 predikát append s rozdílovými seznamy (append dl): append_dl(a-b,b-c,a-c).?- append_dl([a,b X]-X,[c,d Y]-Y,Z). X = [c, d Y] Y = Y Z = [a, b, c, d Y] - Y Yes Úvod do umělé inteligence 2/12 8 / 26

Třídění seznamů quicksort Třídění seznamů predikát qsort(+l,-vysl) třídí seznam L technikou rozděl a panuj Úvod do umělé inteligence 2/12 9 / 26

Třídění seznamů quicksort Třídění seznamů predikát qsort(+l,-vysl) třídí seznam L technikou rozděl a panuj qsort([],[]) :-!. % řez - zahod další možnosti řešení qsort([h],[h]) :-!. qsort([h T],L) :- divide(h,t,m,v), qsort(m,m1), qsort(v,v1), append(m1,[h V1],L). divide(_,[],[],[]) :-!. divide(h,[k T],[K M],V) :- K=<H,!, divide(h,t,m,v). divide(h,[k T],M,[K V]) :- K>H, divide(h,t,m,v). Úvod do umělé inteligence 2/12 10 / 26

Třídění seznamů quicksort II Třídění seznamů predikát qsort dl(+l,-vysl) efektivnější varianta predikátu qsort s rozdílovými seznamy qsort(l,s):- qsort_dl(l,s-[]). qsort_dl([],a-a). qsort_dl([h T],A-B):- divide(h,t,l1,l2), qsort_dl(l2,a1-b), qsort_dl(l1,a-[h A1]). divide(_,[],[],[]):-!. divide(h,[k T],[K M],V):- K=<H,!, divide(h,t,m,v). divide(h,[k T],M,[K V]):- K>H, divide(h,t,m,v). Úvod do umělé inteligence 2/12 11 / 26

Obsah Binární stromy Uspořádané binární stromy 1 Operace na datových strukturách Třídění seznamů 2 Binární stromy Uspořádané binární stromy Přidávání do binárního stromu Odebírání z binárního stromu Vícesměrný algoritmus pro vkládání/odebírání Výpis binárního stromu 3 Reprezentace grafů Reprezentace grafů Cesty v grafech Kostra grafu Úvod do umělé inteligence 2/12 12 / 26

Binární stromy Uspořádané binární stromy Uspořádané binární stromy Reprezentace binárního stromu: nil prázdný strom t(l,hodn,p) strom Příklady stromů: t(nil,8,nil) t(t(nil,1,nil), 2,t(nil,3,nil)) t(nil,2,t(t(nil,3,nil),4,t(nil,5,nil))) Úvod do umělé inteligence 2/12 13 / 26

Binární stromy Uspořádané binární stromy Uspořádané binární stromy Reprezentace binárního stromu: nil prázdný strom t(l,hodn,p) strom Příklady stromů: t(nil,8,nil) t(t(nil,1,nil), 2,t(nil,3,nil)) t(nil,2,t(t(nil,3,nil),4,t(nil,5,nil))) Úvod do umělé inteligence 2/12 13 / 26

Binární stromy Uspořádané binární stromy Uspořádané binární stromy Reprezentace binárního stromu: nil prázdný strom t(l,hodn,p) strom Příklady stromů: t(nil,8,nil) t(t(nil,1,nil), 2,t(nil,3,nil)) t(nil,2,t(t(nil,3,nil),4,t(nil,5,nil))) Úvod do umělé inteligence 2/12 13 / 26

Binární stromy Uspořádané binární stromy Uspořádané binární stromy Reprezentace binárního stromu: nil prázdný strom t(l,hodn,p) strom Příklady stromů: t(nil,8,nil) t(t(nil,1,nil), 2,t(nil,3,nil)) t(nil,2,t(t(nil,3,nil),4,t(nil,5,nil))) Úvod do umělé inteligence 2/12 13 / 26

Binární stromy Přidávání do binárního stromu Přidávání do binárního stromu addleaf(+t,+x,-vysl) přidá do binárního stromu T hodnotu X na správnou pozici vzhledem k setřídění stromu addleaf(nil,x,t(nil,x,nil)). addleaf(t(left,x,right),x,t(left,x,right)). addleaf(t(left,root,right),x,t(left1,root,right)) :- Root>X,addleaf(Left,X,Left1). addleaf(t(left,root,right),x,t(left,root,right1)) :- Root<X,addleaf(Right,X,Right1).?- addleaf(nil,6,t),addleaf(t,8,t1), addleaf(t1,2,t2), addleaf(t2,4,t3), addleaf(t3,1,t4). T4 = t(t(t(nil, 1, nil), 2, t(nil, 4, nil)), 6, t(nil, 8, nil))?- addleaf(t(t(t(nil,1,nil),2,t(t(nil,3,nil),4,t(nil,5,nil))), 6,t(t(nil,7,nil),8,t(nil,9,nil))), 10, T). T = t( t( t(nil, 1, nil), 2, t( t(nil, 3, nil), 4, t(nil, 5, nil))), 6, t( t(nil, 7, nil), 8, t( nil, 9, t(nil, 10, nil)))) Úvod do umělé inteligence 2/12 14 / 26

Binární stromy Přidávání do binárního stromu Přidávání do binárního stromu addleaf(+t,+x,-vysl) přidá do binárního stromu T hodnotu X na správnou pozici vzhledem k setřídění stromu addleaf(nil,x,t(nil,x,nil)). addleaf(t(left,x,right),x,t(left,x,right)). addleaf(t(left,root,right),x,t(left1,root,right)) :- Root>X,addleaf(Left,X,Left1). addleaf(t(left,root,right),x,t(left,root,right1)) :- Root<X,addleaf(Right,X,Right1).?- addleaf(nil,6,t),addleaf(t,8,t1), addleaf(t1,2,t2), addleaf(t2,4,t3), addleaf(t3,1,t4). T4 = t(t(t(nil, 1, nil), 2, t(nil, 4, nil)), 6, t(nil, 8, nil))?- addleaf(t(t(t(nil,1,nil),2,t(t(nil,3,nil),4,t(nil,5,nil))), 6,t(t(nil,7,nil),8,t(nil,9,nil))), 10, T). T = t( t( t(nil, 1, nil), 2, t( t(nil, 3, nil), 4, t(nil, 5, nil))), 6, t( t(nil, 7, nil), 8, t( nil, 9, t(nil, 10, nil)))) Úvod do umělé inteligence 2/12 14 / 26

Binární stromy Přidávání do binárního stromu Přidávání do binárního stromu addleaf(+t,+x,-vysl) přidá do binárního stromu T hodnotu X na správnou pozici vzhledem k setřídění stromu addleaf(nil,x,t(nil,x,nil)). addleaf(t(left,x,right),x,t(left,x,right)). addleaf(t(left,root,right),x,t(left1,root,right)) :- Root>X,addleaf(Left,X,Left1). addleaf(t(left,root,right),x,t(left,root,right1)) :- Root<X,addleaf(Right,X,Right1).?- addleaf(nil,6,t),addleaf(t,8,t1), addleaf(t1,2,t2), addleaf(t2,4,t3), addleaf(t3,1,t4). T4 = t(t(t(nil, 1, nil), 2, t(nil, 4, nil)), 6, t(nil, 8, nil))?- addleaf(t(t(t(nil,1,nil),2,t(t(nil,3,nil),4,t(nil,5,nil))), 6,t(t(nil,7,nil),8,t(nil,9,nil))), 10, T). T = t( t( t(nil, 1, nil), 2, t( t(nil, 3, nil), 4, t(nil, 5, nil))), 6, t( t(nil, 7, nil), 8, t( nil, 9, t(nil, 10, nil)))) Úvod do umělé inteligence 2/12 14 / 26

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu Predikát addleaf není vícesměrný nelze definovat: del(t,x,t1) :- addleaf(t1,x,t). Úvod do umělé inteligence 2/12 15 / 26

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu správný postup: pokud je odebíraná hodnota v listu nahradí se hodnotu nil jestliže je ale v kořenu (pod)stromu je nutné tento (pod)strom přestavět Přestavba binárního stromu při odstraňování kořene X: Úvod do umělé inteligence 2/12 16 / 26

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu delleaf(+t,+x,-vysl) odstraní ze stromu T uzel s hodnotou X delleaf(t(nil,x,right),x,right). delleaf(t(left,x,nil),x,left). delleaf(t(left,x,right),x,t(left,y,right1)) :- delmin(right,y,right1). delleaf(t(left,root,right),x,t(left1,root,right)) :- X<Root,delleaf(Left,X,Left1). delleaf(t(left,root,right),x,t(left,root,right1)) :- X>Root,delleaf(Right,X,Right1). delmin(t(nil,y,r),y,r). delmin(t(left,root,right),y,t(left1,root,right)) :- delmin(left,y,left1). Úvod do umělé inteligence 2/12 17 / 26

Binární stromy Vícesměrný algoritmus pro vkládání/odebírání Vícesměrný algoritmus pro vkládání/odebírání Jiný způsob vkládání: Úvod do umělé inteligence 2/12 18 / 26

Binární stromy Vícesměrný algoritmus pro vkládání/odebírání Vícesměrný algoritmus pro vkládání/odebírání add(?t,+x,?vysl) přidá do binárního stromu T uzel s hodnotou X s přeuspořádáním stromu (jako kořen nebo jinam při navracení) % přidej jako kořen add(t,x,t1) :- addroot(t,x,t1). % nebo kamkoliv do stromu (se zachováním uspořádání) add(t(l,y,r),x,t(l1,y,r)) :- gt(y,x),add(l,x,l1). add(t(l,y,r),x,t(l,y,r1)) :- gt(x,y),add(r,x,r1). addroot(nil,x,t(nil,x,nil)). addroot(t(l,y,r),x,t(l1,x,t(l2,y,r))) :- gt(y,x),addroot(l,x,t(l1,x,l2)). addroot(t(l,y,r),x,t(t(l,y,r1),x,r2)) :- gt(x,y),addroot(r,x,t(r1,x,r2)). addroot(t(l,x,r),x,t(l,x,r)). Definice predikátu gt(x,y) na konečném uživateli. Funguje i obráceně lze definovat: del(t,x,t1) :- add(t1,x,t). Úvod do umělé inteligence 2/12 19 / 26

Výpis binárního stromu Binární stromy Výpis binárního stromu pomocí odsazení zobrazujeme úroveň uzlu ve stromu a celkové uspořádání uzlů (strom je tedy zobrazen naležato ) t( t( 5, t( t(nil,1,nil), 3, t(nil,4,nil)), t(nil,6, t(nil,7,nil)), 8, t(nil,9,nil))) show(+t) vypíše obsah uzlů stromu T se správným odsazením 5 show(t) :- show2(t,0). show2(nil,_). show2(t(l,x,r),indent) :- Ind2 is Indent+2,show2(R,Ind2),tab(Indent), write(x),nl,show2(l,ind2). Úvod do umělé inteligence 2/12 20 / 26 8 3 9 6 4 1 7

Výpis binárního stromu Binární stromy Výpis binárního stromu pomocí odsazení zobrazujeme úroveň uzlu ve stromu a celkové uspořádání uzlů (strom je tedy zobrazen naležato ) t( t( 5, t( t(nil,1,nil), 3, t(nil,4,nil)), t(nil,6, t(nil,7,nil)), 8, t(nil,9,nil))) show(+t) vypíše obsah uzlů stromu T se správným odsazením 5 show(t) :- show2(t,0). show2(nil,_). show2(t(l,x,r),indent) :- Ind2 is Indent+2,show2(R,Ind2),tab(Indent), write(x),nl,show2(l,ind2). Úvod do umělé inteligence 2/12 20 / 26 8 3 9 6 4 1 7

Obsah Reprezentace grafů Reprezentace grafů 1 Operace na datových strukturách Třídění seznamů 2 Binární stromy Uspořádané binární stromy Přidávání do binárního stromu Odebírání z binárního stromu Vícesměrný algoritmus pro vkládání/odebírání Výpis binárního stromu 3 Reprezentace grafů Reprezentace grafů Cesty v grafech Kostra grafu Úvod do umělé inteligence 2/12 21 / 26

Reprezentace grafů Reprezentace grafů Reprezentace grafů Příklady způsobů reprezentace grafů (v Prologu): 1 term graph(v,e), kde V je seznam vrcholů grafu a E je seznam hran grafu. Každá hrana je tvaru e(v1,v2), kde V1 a V2 jsou vrcholy grafu. G = graph([a,b,c,d],[e(a,b),e(b,d),e(b,c),e(c,d)]). znázorňuje orientovaný graf Úvod do umělé inteligence 2/12 22 / 26

Reprezentace grafů Reprezentace grafů 2 vgraph(v,e) definuje uspořádanou dvojici seznamů vrcholů (V) a hran (E). Hrany jsou tvaru a(pocatecniv, KoncovyV, CenaHrany). G = vgraph([s,t,u,v],[a(s,t,3),a(t,v,1), a(t,u,5),a(u,t,2),a(v,u,2)]). znázorňuje orientovaný ohodnocený graf 3 graf může být uložen v programové databázi jako posloupnost faktů (i pravidel). edge(g3,a,b). edge(g3,b,c). edge(g3,b,d). edge(g3,c,d). edge(x,a,b) :- edge(x,b,a). díky přidanému pravidlu představuje neorientovaný graf (bez pravidla je orientovaný). Úvod do umělé inteligence 2/12 23 / 26

Cesty v grafech Reprezentace grafů Cesty v grafech Cesta v neorientovaném grafu: path(+a,+z,+graf,-cesta) v grafu Graf najde z vrcholu A do vrcholu Z cestu Cesta (Graf je ve tvaru 1). path(a,z,graf,cesta) :- path1(a,[z],graf,cesta). path1(a,[a Cesta1],_,[A Cesta1]). path1(a,[y Cesta1],Graf,Cesta) :- adjacent(x,y,graf), \+ member(x,cesta1), path1(a,[x,y Cesta1],Graf,Cesta). adjacent(x,y,graph(des,edges)) :- member(e(x,y),edges);member(e(y,x),edges). Úvod do umělé inteligence 2/12 24 / 26

Cesty v grafech II. Reprezentace grafů Cesty v grafech Cesta v ohodnoceném neorientovaném grafu: path(+a,+z,+graf,-cesta,-cena) hledá libovolnou cestu z jednoho vrcholu do druhého a její cenu v ohodnoceném neorientovaném grafu. path(a,z,graf,cesta,cena) :- path1(a,[z],0,graf,cesta,cena). path1(a,[a Cesta1],Cena1,Graf,[A Cesta1],Cena1). path1(a,[y Cesta1],Cena1,Graf,Cesta,Cena) :- adjacent(x,y,cenaxy,graf), \+ member(x,cesta1), Cena2 is Cena1+CenaXY, path1(a,[x,y Cesta1],Cena2,Graf,Cesta,Cena). adjacent(x,y,cenaxy,graf) :- member(x-y/cenaxy,graf);member(y-x/cenaxy,graf). Graph je seznam hran ve tvaru X-Y/CenaXY (viz adjacent). Úvod do umělé inteligence 2/12 25 / 26

Kostra grafu Reprezentace grafů Kostra grafu Kostra grafu je strom, který prochází všechny vrcholy grafu a jehož hrany jsou zároveň hranami grafu. stree(graph,tree) :- member(edge,graph),spread([edge],tree,graph). spread(tree1,tree,graph) :- addedge(tree1,tree2,graph), spread(tree2,tree,graph). spread(tree,tree,graph) :- \+ addedge(tree,_,graph). addedge(tree,[a-b Tree],Graph) :- adjacent(a,b,graph),node(a,tree), \+ node(b,tree). adjacent(a,b,graph) :- member(a-b,graph);member(b-a,graph). node(a,graph) :- adjacent(a,_,graph).?- stree([a-b,b-c,b-d,c-d],t). T = [b-d, b-c, a-b] Yes Úvod do umělé inteligence 2/12 26 / 26

Kostra grafu Reprezentace grafů Kostra grafu Kostra grafu je strom, který prochází všechny vrcholy grafu a jehož hrany jsou zároveň hranami grafu. stree(graph,tree) :- member(edge,graph),spread([edge],tree,graph). spread(tree1,tree,graph) :- addedge(tree1,tree2,graph), spread(tree2,tree,graph). spread(tree,tree,graph) :- \+ addedge(tree,_,graph). addedge(tree,[a-b Tree],Graph) :- adjacent(a,b,graph),node(a,tree), \+ node(b,tree). adjacent(a,b,graph) :- member(a-b,graph);member(b-a,graph). node(a,graph) :- adjacent(a,_,graph).?- stree([a-b,b-c,b-d,c-d],t). T = [b-d, b-c, a-b] Yes Úvod do umělé inteligence 2/12 26 / 26