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

Podobné dokumenty
Logické programování I

Seminární práce z Teorie ICT

Logické programování

Logika a logické programování

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

Matematická logika. Miroslav Kolařík

popel, glum & nepil 16/28

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

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

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

Programování v čistém Prologu

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

Programovací jazyk Prolog

Logické programování

Programovací jazyk Prolog

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

Modely Herbrandovské interpretace

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

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

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

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

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

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

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

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

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

Logické programy Deklarativní interpretace

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

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

Matematická logika. Rostislav Horčík. horcik

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

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

Částečná korektnost. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

Sémantika predikátové logiky

Rezoluční kalkulus pro logiku prvního řádu

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

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

Klauzulární logika. Znalostní báze. Šárka Vavrečková

4.2 Syntaxe predikátové logiky

Operace na datových strukturách

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

Operátory. Základy programování 1 Tomáš Kühr

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

Úvod do logiky (presentace 2) Naivní teorie množin, relace a funkce

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

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

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

Úvod do umělé inteligence, jazyk Prolog

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

Výroková logika - opakování

Úvod do umělé inteligence, jazyk Prolog

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

Programovací jazyk Pascal

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

Klasická predikátová logika

Od Aristotela k Prologu

Skolemizace. x(x + f(x) = 0). Interpretace f unární funkce, která pro daný

Základy logiky a teorie množin

Úvod do umělé inteligence, jazyk Prolog

Tableaux metody. Jiří Vyskočil 2011

Operace na datových strukturách

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

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

Úvod do umělé inteligence, jazyk Prolog

Logika. 5. Rezoluční princip. RNDr. Luděk Cienciala, Ph. D.

Deskripční logika. Petr Křemen FEL ČVUT. Petr Křemen (FEL ČVUT) Deskripční logika 37 / 157

ZÁKLADY LOGIKY A METODOLOGIE

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

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

Každé formuli výrokového počtu přiřadíme hodnotu 0, půjde-li o formuli nepravdivou, a hodnotu 1, půjde-li. α neplatí. β je nutná podmínka pro α

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

Úvod do databázových systémů

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

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

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

Znalosti budeme nejčastěji vyjadřovat v predikátové logice prvního řádu. Metody:

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

Další (neklasické) logiky. Jiří Velebil: AD0B01LGR 2015 Predikátová logika 1/20

Predikátová logika. Teoretická informatika Tomáš Foltýnek

Substituce. Petr Štěpánek. S využitím materialu Krysztofa R. Apta. Logické programování 2 1

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

Algoritmizace prostorových úloh

1 Predikátová logika. 1.1 Syntax. jaký mohou mít formule význam (sémantiku). 1. Logických symbolů: 2. Speciálních (mimologických) symbolů:

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:

Úvod do TI - logika Predikátová logika 1.řádu (4.přednáška) Marie Duží marie.duzi@vsb.cz

Predikátová logika dokončení

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

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

1 Výroková logika 1. 2 Predikátová logika 3. 3 Důkazy matematických vět 4. 4 Doporučená literatura 7

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

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

2.2 Sémantika 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.

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

Reprezentace znalostí. Katedra kybernetiky, ČVUT v Praze.

Algoritmizace prostorových úloh

Základy logiky Logika a logické systémy. Umělá inteligence a rozpoznávání, LS

Paradigmata programování 1

Transkript:

Ú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 pozdější rozšíření Prologu o logické programování s omezujícími podmínkami aplikace: umělá inteligence, nenumerické programování,... deklarativní programování specifikační jazyk, jasná sémantika, nevhodné pro procedurální postupy Co dělat namísto Jak dělat základní mechanismy unifikace, stromové datové struktury, automatický backtracking Logické programování I 2 Úvod do Prologu

Program, klauzule, dotaz program je složen z klauzulí: rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). % komentář na konci řádku rodic( petr, jirka ). /* komentář */ dotazy:?- rodic( robert, petr). % yes splnitelný dotaz?- rodic( eliska, petr). % no nesplnitelný dotaz?- rodic( X, eliska ). % proměnná X?- rodic( X, Y ). % všechna řešení přes ";"?- rodic (Y, jirka), rodic( X, Y ). % dotaz složený z několika cílů Logické programování I 3 Úvod do Prologu

Program II. definice relací pomocí n-tic objektů splňujících relaci (prologovský) program je množina klauzulí, klauzule jsou ukončeny tečkou uživatel klade dotazy na relace v programu základní příklady argumentů relací konstanty: (tomas, anna) proměnné: X, Y dotaz se skládá z jednoho nebo více cílů :-? rodic (Y, jirka), rodic( X, Y ). konjunkce cílů odpověd na dotaz positivní cíl je splnitelný a uspěl negativní cíl je nesplnitelný a neuspěl Prolog umí generovat více odpovědí pokud existují Logické programování I 4 Úvod do Prologu

Fakta, pravidla rodic( pavla, robert ). potomek( Y, X ) :- rodic( X, Y ). % fakt % pravidlo složené z hlavy a těla?- potomek( robert, X ). Alternativní (obousměrný) význam pravidel pro každé X a Y, pro každé X a Y, Y je potomek X, jestliže X je rodič Y, potom X je rodič Y Y je potomek X matka( X, Y ) :- rodic( X, Y ), zena( X ). % tělo složené z více cílů zena( pavla ). Logické programování I 5 Úvod do Prologu

klauzule: fakta, pravidla, dotazy Fakta, pravidla II. fakta: deklarují vždy pravdivé věci pravidla: deklarují věci, jejichž pravdivost závisí na daných podmínkách dotazy: uživatel se ptá programu, zda jsou věci pravdivé proměnné jsou během výpočtu nahrazeny objekty proměnná je instanciována dosud nenainstanciovaná proměnná: volná proměnná predikát: určen funktorem a aritou definující relaci, např. predek/2 predikát je implementován procedurou množina klauzulí, jejichž hlava má Logické programování I 6 Úvod do Prologu

Klauzule klauzule se skláda z hlavy a těla tělo je seznam cílů oddělených čárkami, čárka = konjunkce fakt: pouze hlava, prázdné tělo rodic( pavla, robert ). pravidlo: hlava i tělo predek( X, Z ) :- rodic( X, Y ), predek( Y, Z ). dotaz: prázdná hlava, pouze tělo?- rodic( pavla, X ). Logické programování I 7 Úvod do Prologu

Rekurzivní pravidla predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2) rodic( Y, Z ). Logické programování I 8 Úvod do Prologu

Rekurzivní pravidla predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2) rodic( Y, Z ). predek( X, Z ) :- rodic( X, Y ), % (2 ) predek( Y, Z ). Logické programování I 8 Úvod do Prologu

Jak Prolog vyhodnocuje (odpovídá na) dotazy matematicky: fakta + pravidla = množina axiomů dotaz = teorém, který chceme dokázat?- predek( tomas, petr). důkaz: rodic( robert, petr ) predek( robert, petr ). odvozený fakt rodic( tomas, robert ) a zároveň predek( robert, petr ) predek( tomas, petr ). Prolog počítá v inverzním pořadí Logické programování I 9 Úvod do Prologu

Trasování dotazu :-? predek( tomas, petr) predek(tomas, petr) dle (1) dle (2 ) no rodic( tomas, petr) rodic(tomas, Y) predek( Y, petr) Y=robert dle rodic(tomas, robert) predek( robert, petr) dle (1) rodic(robert, petr) yes Logické programování I 10 Úvod do Prologu

Rodokmen rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). rodic( petr, jirka ). pavla anna robert tomas petr eliska jirka predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2 ) predek( Y, Z ). Logické programování I 11 Úvod do Prologu

Syntaxe a význam Prologovských programů

Syntaxe Prologovských programů typy objektů jsou rozpoznávány podle syntaxe atom řetězce písmen, čísel, _ začínající malým písmenem: pavel, pavel_novak, x25 řetězce speciálních znaků: <-->, ====> řetězce v uvozovkách: Pavel, Pavel Novák celá a reálná čísla: 0, -1056, 0.35 proměnná řetězce písmen, čísel, _ začínající velkým písmenem nebo _ anonymní proměnná: ma_dite(x) :- rodic( X, _ ). hodnotu anonymní proměnné Prolog na dotaz nevrací:?- rodic( X, _ ) lexikální rozsah proměnné je pouze jedna klauzule: prvni(x,x,x). prvni(x,x,_). Logické programování I 13 Syntaxe a význam Prologovských programů

Struktury term datové objekty v Prologu: datum( 1, kveten, 2003 ) funktor: datum argumenty: 1, kveten, 2003 arita počet argumentů: 3 všechny strukturované objekty v Prologu jsou stromy trojuhelnik( bod(4,2), bod(6,4), bod(7,1) ) hlavní funktor termu funktor v kořenu stromu odpovídající termu trojuhelnik je hlavní funktor v trojuhelnik( bod(4,2), bod(6,4), bod(7,1) ) Logické programování I 14 Syntaxe a význam Prologovských programů

Unifikace termy jsou unifikovatelné, jestliže jsou identické nebo proměnné v obou termech mohou být instanciovány tak, že termy jsou po substituci identické datum( D1, M1, 2003 ) = datum( 1, M2, Y2) operátor = D1 = 1, M1 = M2, Y2 = 2003 nejobecnější unifikátor (most general unifier (MGU) jiné instanciace?... D1 = 1, M1 = 5, Y2 = 2003?- datum( D1, M1, 2003 ) = datum( 1, M2, Y2), D1 = M1. kontrola výskytu (occurs check)?- X=f(X). X = f(f(f(f(f(f(f(f(f(f(...)))))))))) Logické programování I 15 Syntaxe a význam Prologovských programů

Deklarativní a procedurální význam programů p :- q, r. deklarativní: Co je výstupem programu? p je pravdivé, jestliže q a r jsou pravdivé Z q a r plyne p význam mají logické relace procedurální: Jak vypočítáme výstup programu? p vyřešíme tak, že nejprve vyřešíme q a pak r kromě logických relací je významné i pořádí cílů výstup indikátor yes/no určující, zda byly cíle splněny instanciace proměnných v případě splnění cílů Logické programování I 16 Syntaxe a význam Prologovských programů

Deklarativní význam programu instance klauzule: proměnné v klauzuli jsou substituovány termem ma_dite(x) :- rodic( X, Y ). ma_dite(petr) :- rodic( petr, Z ). Máme-li program a cíl G, pak deklarativní význam říká: cíl G je splnitelný právě tehdy, když existuje klauzule C v programu taková, že existuje instance I klauzule C taková, že hlava I je identická s G a všechny cíle v těle I jsou pravdivé. Logické programování I 17 Syntaxe a význam Prologovských programů

Konjunce "," vs. disjunkce ";" cílů konjunce = splnění všech cílů p :- q, r. disjunkce = splnění libovolného cíle p :- q; r. p :- q. p :- r. priorita středníku je vyšší: p :- q, r; s, t, u. p :- (q, r) ; (s, t, u). p :- q, r. p :- s, t, u. Logické programování I 18 Syntaxe a význam Prologovských programů

Pořadí klauzulí a cílů nebezpečí nekonečných cyklů: p :- p. stejný deklarativní ale odlišný procedurální význam predek( X, Z ) :- rodic( X, Z). predek( X, Z ) :- rodic( X, Y), predek( Y, Z ). změna pořádí klauzulí programu, změna pořadí cílů v těle klauzule: predek2( X, Z ) :- predek2( Y, Z ), rodic( X, Y). predek2( X, Z ) :- rodic( X, Z). :-? predek( tomas, petr ). :-? predek2( tomas, petr ). % chyba: "insufficient memory" jednodušší myšlenky zkusit první Logické programování I 19 Syntaxe a význam Prologovských programů

Seznamy, operátory

Reprezentace seznamu seznam: [a, b, c] všechny strukturované objekty stromy i seznamy! seznam = atom: [] hlava (libovolný objekt), tělo (seznam):.(hlava, Telo) [] značí prázdný seznam.(a,.(b,.(c, []) [ Hlava Telo ]: [a,b,c] = [a [b,c]] = [a,b [c]] = [a,b,c []] pozor: [ [a,b] [c] ] [ a,b [c] ] Logické programování I 21 Seznamy, operátory

Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b] [c]] ). X je prvek seznamu S, když X je hlava seznamu S nebo member( X, [ X _ ] ). X je prvek těla seznamu S member( X, [ _ Telo ] ) :- member( X, Telo ). Logické programování I 22 Seznamy, operátory

Spojení seznamů append( L1, L2, L3 ) platí: append( [a,b], [c,d], [a,b,c,d] ) neplatí: append( [a,b], [c,d], [b,a,c,d] ) definice: pokud je první argument prázdný seznam, pak druhý a třetí argument jsou stejné seznamy: append( [], S, S ). pokud je první argument neprázdný seznam, pak má třetí argument stejnou hlavu jako první: append( [X S1], S2, [X S3] ) :- append( S1, S2, S3). Logické programování I 23 Seznamy, operátory

Příklady použití append spojení seznamů: append( [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] append( [a, [b,c], d], [a, [], b], S ). S = [a, [b,c], d, a, [], b] ] dekompozice seznamu na dva seznamy: append( S1, S2, [ a, b ]). S1 = [], S2 = [a,b] ; S1 = [a], S2 = [b]? ; S1 = [a,b], S2 = [] vyhledávání v seznamu: append( Pred, [ c Za ], [a,b,c,d,e] ). Pred = [a,b], Za = [d,e] předchůdce a následník: append( _, [Pred,c,Za _], [a,b,c,d,e] ). Pred = b, Za = d efektivita Logické programování I 24 Seznamy, operátory

Přidání a smazání prvku seznamu přidání prvku na začátek: add( X, S, [X S] ). smazání prvku delete( X, S, S1 ) jestliže X je hlava seznamu S, pak výsledkem je tělo S delete( X, [X Telo], Telo). jestliže X je v těle seznamu, pak X je smazán až v těle delete( X, [Y Telo], [Y Telo1] ) :- delete( X, Telo, Telo1 ). delete smaže libovolný výskyt prvku pomocí backtrackingu?- delete(a, [a,b,a,a], S). S = [b,a,a]; S = [a,b,a]; S = [a,b,a] Logické programování I 25 Seznamy, operátory

Operátory infixová notace: 2*a + b*c prefixová notace: +( *(2,a), *(b,c) ) priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). definice operátoru: :- op( 600, xfx, zna ). :- op( 1100, xfy, ; ). :- op( 1000, xfy,, ). definice operátoru není spojena s datovými manipulacemi (kromě speciálních případů) Logické programování I 26 Seznamy, operátory

Typy operátorů Typy operátorů infixové operátory: xfx, xfy, yfx prefixové operátory: fx, fy postfixové operátory: xf, yf x a y určují priorita argumentu a-b-c odpovídá (a-b)-c a ne a-(b-c): - odpovídá yfx x reprezentuje argument, jehož priorita musí být striktně menší než u operátoru y reprezentuje argument, jehož priorita je menší nebo rovna operátoru Logické programování I 27 Seznamy, operátory