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

Podobné dokumenty
Operace na datových strukturách

Operace na datových strukturách

Logické programování I

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

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

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

popel, glum & nepil 16/28

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

Programovací jazyk Prolog

Programování v čistém Prologu

IB015 Neimperativní programování. Neimperativní programování v Prologu. Jiří Barnat

Logika a logické programování

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

Seminární práce z Teorie ICT

Programovací jazyk Prolog

vhodná pro strojové dokazování (Prolog) metoda založená na vyvracení: dokazuje se nesplnitelnost formulí

Využití principů, ale vlastní naprogramování řešících

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

Logické programování

Logické programování

IA008 Computational logic Version: 6. května Formule je v konjunktivní normální formě (CNF), pokud má tvar α 1... α n,

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

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

Occur-check (Test konfliktu proměnných)

IB013 Logické programování I Hana Rudová. jaro 2011

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

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

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

Úvod do TI - logika Logické programování, PROLOG (10.přednáška) Marie Duží

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.

Marie Duží

Stefan Ratschan. Fakulta informačních technologíı. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

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

Programovací í jazyk Haskell

Kombinatorika, výpočty

Zastavování výpočtů (Terminace)

Paradigmata programování 1

1 Prolog. 1.1 Histroie. 1.2 Základní rysy Prologu. 1.3 Databáze Prologu

Úvod. Programovací paradigmata

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

Programovací jazyk Haskell

Dokumentace programu sdc

Logické programování s omezujícími podmínkami. Constraint Logic Programming: CLP

Modely Herbrandovské interpretace

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Umělá inteligence I. Roman Barták, KTIML.

IB111 Úvod do programování skrze Python

Programovací jazyk Pascal

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

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

Algoritmizace prostorových úloh

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Rovnost lze vyjádřit jako predikát, např. můžeme zvolit, že P(x, y) reprezentujetvrzení xjerovnoy.

Klauzulární logika. úvod. Šárka Vavrečková. 20. října Ústav informatiky Filozoficko-Přírodovědecká fakulta Slezské univerzity, Opava

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

Přednáška 3. Rekurze 1

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

Úvod do programovacích jazyků (Java)

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

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

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

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

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

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

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]

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

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

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

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

" Použij t lo pravidla, kterým v dotazu nahra ást Q1.! Pro pravidla, kde T lo=true, dotaz Q1 zmizí. " Opakuj, dokud nezískáš prázdný dotaz.

ALGORITMIZACE PRAKTICKÉ

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

IB111 Úvod do programování skrze Python

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

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

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

Matematická logika. Miroslav Kolařík

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Logické programy Deklarativní interpretace

Úvod do programování. Lekce 1

Od Aristotela k Prologu

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

postaveny výhradně na syntaktické bázi: jazyk logiky neinterpretujeme, provádíme s ním pouze syntaktické manipulace důkazy

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

Hilbertovský axiomatický systém

12. Automatické vyhodnocení derivací. jaro 2012

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

Tableaux metody. Jiří Vyskočil 2011

1 REZOLUČNÍ FORMÁLNÍ DŮKAZY

Úvod do programování. Lekce 5

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

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

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

a operačních systémů

Transkript:

IB101, log programování, Prolog Logické programování logický program: libovolná konečná množina programových Hornových klauzulí odvozování (dokazování) cílů založeno na SLD-rezoluci deklarativní (specifikace programu je přímo programem) teoretický model, zachovává úplnost popel, glum & nepil 1/18

IB101, log programování, Prolog Prolog konkrétní implementace logického programovacího jazyka strategie prohledávání stavového prostoru (SLD-stromu) do hloubky (výběr programové klauzule shora dolů, výběr podcíle zleva doprava) díky prohledávání do hloubky ztráta úplnosti (uváznutí v nekonečné větvi SLD-stromu) vhodný k řešení problémů týkajících se objektů a vztahů mezi nimi do značné míry využívá rekurzi historie: 70 l 20 stol Colmerauer, Kowalski; DHD Warren (WAM) popel, glum & nepil 2/18

IB101, log programování, Prolog Syntax jazyka Prolog I Datové objekty termy (konstanty, proměnné, složené termy) konstanty: celá čísla (0, 123, -12), desetinná čísla (10, 45E7, -012e+8), atomy ( Petr Parléř, [], s1, ==, ježek, atom) proměnné (N, VYSLEDEK, Hodnota, A1, 12), anonymní proměnná ( ) složené termy: funktor (jméno, arita) a argumenty (bod(x,y,z), tree(value,tree(lv,ll,lr),tree(rv,rl,rr))) poznámka: funktory jako operátory použití infixového zápisu ( X < Y místo <(X,Y) apod ) popel, glum & nepil 3/18

IB101, log programování, Prolog Syntax jazyka Prolog II Program množina programových klauzulí (pravidla, fakta) proměnné lokální v klauzuli, kde se vyskytují pravidla: hlava, tělo date(d,m,y):- day(d), month(m), year(r) fakta: pravidla s prázdným tělem date(14, February,2001) cíle: klauzule bez hlavy, reprezentují dotazy spuštění výpočtu?- date(29, January,2001) Explicitní unifikace: operátor = Př: X=Y, f(g(a,x))=f(y) popel, glum & nepil 4/18

IB101, log programování, Prolog SLD-strom pro prologovský program: srovnání 1 p(x,y) :- q(x,z), r(z,y) 5 q(x,a) :- r(a,x) 9 s(x) :- t(x,x) 2 p(x,x) :- s(x) 6 r(b,a) 10 t(a,b) 3 q(x,b) 7 s(x) :- t(x,a) 11 t(b,a) 4 q(b,a) 8 s(x) :- t(x,b)?- p(x,x) 1?- p(x,x) 2?- q(x,z), r(z,x)?- s(x) 3 5 7 9 4 8?- r(b,x)?- r(a,b)?- r(a,x), r(a,x)?- t(x,a)?- t(x,b)?- t(x,x) 6 11 10 [X=a] fail fail [X=b] [X=a] fail popel, glum & nepil 5/18

IB101, log programování, Prolog SLD-odvození pro prologovský program Příklad: odvození cílů pro program: num(0) num(s(x)):- num(x)?- num(0)?- num(s(s(0))) num(s(s(0)) num(s(x)), num(x) X/s(0) X/s(0) num(s(0)) num(s(x)), num(x) num(0) num(0) X/0 X/0 num(0) num(0) popel, glum & nepil 6/18

IB101, log programování, Prolog Příklad: ukázka neúplnosti systému 1 equal(x,y):- equal(y,x) 2 equal(3+2,5)?- equal(3+2,5)?- equal(3+2,5) 1 2?- equal(5,3+2) 1?- equal(3+2,5) 1 2?- equal(5,3+2) 1 popel, glum & nepil 7/18

IB101, log programování, Prolog Seznam rekurzivní datová struktura uspořádaná posloupnost prvků (libovolných termů včetně seznamů) funktor /2; prázdný seznam [] (Hlava,Tělo), alternativně [Hlava Tělo], Tělo je 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 []]]] možnost reprezentace pomocí stromů popel, glum & nepil 8/18

IB101, log programování, Prolog Operace se seznamy:,být prvkem I možné různé varianty: 1) pomocí unifikace: member(x,[x _]) member(x,[_ T]):- member(x,t)?- member(a,[b,c,a]) Yes?- member(a,[x,b,c]) X=a Yes popel, glum & nepil 9/18

IB101, log programování, Prolog 2) pomocí identity: Operace se seznamy:,být prvkem II member(x,[y _]):- X == Y member(x,[_ T]):- member(x,t)?- member(a,[x,b,c]) % No?- member(a,[a,b,a]),write(ok),nl,fail ok ok No 3) bez vícenásobných výskytů: member(x,[y _]):- X == Y member(x,[y T]):- X \== Y, member(x,t)?- member(a,[a,b,a]),write(ok),nl,fail ok No popel, glum & nepil 10/18

IB101, log programování, Prolog Spojení dvou seznamů append([],l,l) append([h T1],L2,[H T]):- append(t1,l2,t) ------------------------------------------?- 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 = []; No popel, glum & nepil 11/18

IB101, log programování, Prolog Seznamy: obrácení pořadí prvků reverse([],[]) reverse([h T],L):- reverse(t,l1), append(l1,[h],l) ---------------------------------------------------?- reverse([a,b,c],l) L = [c, b, a] Yes?- reverse([a,b,c],[c,b,a]) Yes?- reverse(l,[a,b,c]) L = [c, b, a] Yes Další operace se seznamy: permutace, prefix, postfix, podseznam, třídění popel, glum & nepil 12/18

IB101, log programování, Prolog Seznamy: třídění I 0) naivní třídění: strategie generuj a testuj (pokud možno nepoužívat) naive_sort(l,s):- perm(l,s), sorted(s) % perm vrací postupně všechny permutace seznamu sorted([]) sorted([_]) sorted([x,y T]):- X=<Y, sorted([y T]) 1) třídění vkádáním (insert sort) insert(x,[],[x]) insert(x,[y T1],[Y T2]):- X>Y, insert(x,t1,t2) insert(x,[y T1],[X,Y T1]):- X=<Y isort([],[]) isort([x L],S):- isort(l,y), insert(x,y,s) popel, glum & nepil 13/18

IB101, log programování, Prolog Seznamy: třídění II 2) přístup,rozděl a panuj : quick sort qsort([],[]) 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) popel, glum & nepil 14/18

IB101, log programování, Prolog Aritmetika v Prologu funkční operátory: + - * / mod (a další: ˆ // sqrt()) vyhodnocení výrazů: is?- A is 3*(4+2) A=18 Yes?- A is 3*(B+2) chyba relační operátory: < > >= =<?- 3*4 > 2 Yes?- B =< 14 chyba popel, glum & nepil 15/18

IB101, log programování, Prolog Příklad: symbolické derivace derive(x,v):- d(x,a), simpl(a,v) d(x, 1) d(n, 0) :- number(n) d(-x, -A) :- d(x,a) d(x + Y, A + B) :- d(x,a), d(y,b) d(x - Y, A - B) :- d(x,a), d(y,b) d(x * Y, A*Y + B*X):- d(x,a), d(y,b) d(x / Y, (A*Y - X*B) / Yˆ2):- d(x,a), d(y,b) d(x ˆ N, N*XˆM * C):- number(n), M is N-1, d(x, C) d(fˆg, FˆG*(B*log(F) + A*G/F)) :- d(g, B), d(f, A) d(log(x), 1/X * Y) :- d(x,y) d(exp(x), exp(x)*y):- d(x,y) d(sin(x), cos(x)*y):- d(x,y) d(cos(x), -sin(x)*y):- d(x,y) d(arctg(x), 1/(1+Xˆ2)*Y):- d(x,y) popel, glum & nepil 16/18

IB101, log programování, Prolog Programování: užitečné predikáty načtení programu: consult( programpl ) [ programpl ] [ programpl,program2] reconsult(program) interaktivní zadání programu (ukončení ctrl+d): [user] výpis interaktivně zadaného kódu: listing ukončení práce: halt popel, glum & nepil 17/18

IB101, log programování, Prolog Prology na FI SICStus Prolog (module add sicstus; sicstus) komerční ECLiPSe (module add eclipse; eclipse) komerční SWI (module add pl; pl) volně šiřitelný unixové stroje aisa, erinys, oreias, nymfe sicstus pod Windows (lze nainstalovat i jiné) další volně šiřitelné Prology (yap), možnost instalace na různé platformy popel, glum & nepil 18/18