Programování v čistém Prologu

Podobné dokumenty
popel, glum & nepil 16/28

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

Logické programy Deklarativní interpretace

Modely Herbrandovské interpretace

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

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

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

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

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

4.2 Syntaxe predikátové logiky

Logika a logické programování

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

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

SLD-derivace. Petr Štěpánek. S využitím materiálu Krysztofa R. Apta

Logické programování

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

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

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

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

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

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

Operační výzkum. Síťová analýza. Metoda CPM.

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

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Základy umělé inteligence

Matematická logika. Miroslav Kolařík

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Matematická logika. Rostislav Horčík. horcik

Predikátová logika dokončení

Seminární práce z Teorie ICT

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

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

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

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

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

Logické programování I

Logické programování

Tableaux metody. Jiří Vyskočil 2011

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Množiny, relace, zobrazení

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

2.5 Rezoluční metoda v predikátové logice

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

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

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

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

Výroková logika - opakování

Predik atov a logika - pˇredn aˇska () Predik atov a logika - pˇredn aˇska / 16

Úvod do výrokové a predikátové logiky

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

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


Rezoluční kalkulus pro výrokovou logiku

Naproti tomu gramatika je vlastně soupis pravidel, jak

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

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

Matematická logika. Miroslav Kolařík

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

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

Matematická logika. Miroslav Kolařík

Matematická logika. Rostislav Horčík. horcik

Vlastnosti Derivační strom Metody Metoda shora dolů Metoda zdola nahoru Pomocné množiny. Syntaktická analýza. Metody a nástroje syntaktické analýzy

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

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

NP-úplnost problému SAT

Programovací jazyk Prolog

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

Matematika III. Miroslava Dubcová, Daniel Turzík, Drahoslava Janovská. Ústav matematiky

Limita a spojitost funkce a zobrazení jedné reálné proměnné

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

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

Úvod do informatiky. Miroslav Kolařík

Principy indukce a rekurentní rovnice

Representace znalostí s použitím klasické negace

Úvod do logiky (PL): sémantika predikátové logiky

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 2017

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

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

Kapitola Základní množinové pojmy Princip rovnosti. Dvě množiny S a T jsou si rovny (píšeme S = T ) prvek T je také prvkem S.

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

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

Pro každé formule α, β, γ, δ platí: Pro každé formule α, β, γ platí: Poznámka: Platí právě tehdy, když je tautologie.

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 2015

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

Matematická logika. Rostislav Horčík. horcik

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

Matematika I (KMI/5MAT1)

analytické geometrie v prostoru s počátkem 18. stol.

1 Pravdivost formulí v interpretaci a daném ohodnocení

Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují

KMA/MDS Matematické důkazy a jejich struktura

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D.

Výroková logika syntaxe a sémantika

IB112 Základy matematiky

Binární vyhledávací stromy pokročilé partie

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

Úvod do řešení lineárních rovnic a jejich soustav

Bezkontextové jazyky. Bezkontextové jazyky 1 p.1/39

Transkript:

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 mohou sloužit jako programovací jazyk. To je jen první krok na dlouhé cestě ke skutečnému programovacímu jazyku. Kromě mnoha jiných problémů je třeba řešit otázku efektivnosti a uživatelského prostředí takového jazyka. Prolog je programovací jazyka založený na myšlence logického programování, který oba zmíněné problémy řeší přijatelným způsobem. V této kapitole se budeme zabývat programováním v podmnožině Prologu, která odpovídá logickým programům. Tuto podmnožinu budeme nazývat Čistý Prolog. Každý logický program, pokud se na něj díváme jako na posloupnost klauzulí, tedy ne jako na množinu klauzulí (což je v logickém programování možné,) je také programem v čistém Prologu. Naopak to však neplatí. Logické programování 9 2

Všechny logické programy, pokud se na ně díváme jako na posloupnost klauzulí a ne jako na množinu klauzulí, je program v čistém Prologu. Zatím jsme uvedli jenom tři takové programy, SUMMER, SUM, PATH je možné spustit v každém současném Prologovském systému. Logické programování 9 3 Čistý Prolog syntaktické konvence Každá klauzule programu a každý dotaz je zakončen tečkou. Abychom zdůraznili, že nejde o plný Prolog, místo prologovské implikace :- píšeme jako dosud šipku a u jednotkových klauzulí ji vynecháváme. Jednotkové klauzule nazýváme fakta a klauzule, které mají neprázdné tělo nazýváme pravidla. Definice predikátu. Je-li P daný program a p predikátový symbol vyskytující se v P, definicí tohoto predikátu rozumíme množinu všech klauzulí programu P, v jejichž hlavách se vyskytuje predikátový symbol p. Logické programování 9 4

Termové konvence znakové řetezce začínající malým pismenem například f, g, suma, summer happy jsou vyhrazeny pro jména predikátů a funkcí. (Tyto nenumerické konstanty se v kontextu Prologu nazývají atomy.) znakové řetězce začínající velkým písmenem nebo podtržítkem _ například X, Xs, _1796 označují proměnné. řádky komentářů začínají vždy symbolem %. Logické programování 9 5 Ambivalentní syntax Ačkoliv v predikátové logice (mlčky) předpokládáme, že množiny funkčních a predikátových symbolů jsou disjunktní a disjunktní jsou i množiny symbolů různé četnosti, v Prologu můžeme použít stejné jméno pro funkční nebo predikátový symbol a dokonce současně v několika četnostech. funkční nebo predikátový symbol f četnosti jako f / n. n deklarujeme krátce Příklad. V kontextu Prologu můžeme tentýž symbol p použít jako predikátový symbol p / 2 a funkční symbol p / 1 a p / 2. Potom se můžeme setkat se syntakticky správným faktem. p(p(a, b), [c, p(a)]). Logické programování 9 6

Při používání ambivalentní syntaxe je třeba změnít Martelliho a Montanariho unfikační algoritmus následovně: V akci 2 musíme připustit, že na obou stranách rovnosti jsou stejné funkční symboly. Formulujeme novou verzi akce 2 : Akce 2 f (s 1,, s n ) = g ( t 1,, t m ) pokud f g nebo n m stop neúspěch V dalším výkladu budeme (v souladu s praxí) funkce četnosti nula nazývat konstanty a funkčními symboly budeme rozumět jenom symboly kladné četnosti. Logické programování 9 7 Anonymní proměnné Prolog umožňuje používání takzvaných anonymních proměnných, které se označují podtržítkem _. Jde o proměnné na jejichž hodnotách nám nezáleží (máme zájem jen na tom, že taková věc existuje). Takové proměnné se v klauzuli nebo v dotaze vyskytují zpravidla jenom jednou. Proto každý výskyt anonymní proměnné v klauzuli nebo dotazu se interpretuje jako jiná proměnná. Moderní verze Prologu, například SICStus Prolog, při syntaktické analýze programu identifikují solitérní proměnné a doporučují zaměnit je anonymními proměnnými. Do čistého Prologu zařadíme obě syntaktické možnosti : ambivalentní syntax i anonymní proměnné. Logické programování 9 8

Výpočty Výpočetní proces Prologu se řídí následujícími pravidly: (i) Výběrové pravidlo je pevně stanoveno a vybírá z každého dotazu nejlevější atom. Z praktických důvodů v takovém případě budeme mluvit o LD-rezoluci místo o SLD-rezoluci, Podobně budeme mluvit o LD-derivacích, LD-stromech atd. (ii) Klauzule použitelné k vybranému atomu dotazu se zkouší v pořadí, v jakém jsou uvedeny v programu, program je tedy posloupnost klauzulí. Logické programování 9 9 Silná věta o úplnosti SLD-rezoluce říká, že (až na přejmenování proměnných) lze všechny vypočténé odpovědi k danému dotazu najít v SLD-stromu daného programu. Nicméně výpočty některých logických programů mohou být beznadějně neefektivní i v případě, že se omezíme jen na výběrové pravidlo nejlevějšího atomu. To znamená, že prohledávání LD-stromu (stavového prostoru LD-rezolvent) se stává vitálním aspektem z hlediska efektivnosti výpočtu. Pokud bychom prohledávali LD-strom do šířky, tedy po hladinách, máme zaručeno, že pokud existuje, vypočtenou odpovědní instanci (vypočtenou odpovědní substituci) jistě najdeme. Je zřejmé, že takové prohledávání může být exponenciálně složité vzhledem k výšce stromu a totéž platí o paměťových nárocích na ukládání navštívených uzlů. Logické programování 9 10

Prohledávání do hloubky Terminologie. Uspořádaný strom je strom, je zakořeněný a pro každý jeho uzel platí, že jeho bezprostřední následnící jsou lineárně uspořádané. Prohledávání do hloubky se používá většinou jen u zakořeněných konečně se větvících stromů. Navíc se předpokládá, že každý list je označen jako úspěšný (success) nebo neúspěšný (fail). Prohledávání do hloubky začíná v koření stromu a je charakterizováno tím, že z následníků již navštíveného uzlu je navštíven dříve než jeho sourozenci napravo od něj. Při takovém prohlednávání je každá hrana stromu navšívena nejvýše jednou. Logické programování 9 11 Navštívíme-li úspěšný list stromu, tento fakt je avizován. Navštívíme-li list označený jako neúspěšný, je vyvolán proces navracení (backtracking). To znamená návrat k rodičovskému uzlu a pokračování od jeho dalšího následníka napravo, pokud existuje. V opačném případě se navracíme k rodičovskému uzlu o hladinu výš. Prohledávání pokračuje až do okamžiku kdy se navrátí až ke kořenu stromu a všechny jeho následníci již byly navštíveny. Jestliže prohledávání do hloubky vstoupí do nekonečné větve stromu dříve než byl navštíven úspěšný list, výsledkem je divergence tohoto procesu. Logické programování 9 12

Prohledávání LD-stromů V případě Prologu prohledávání do hloubky provádíme v LD-stromu odpovídajícímu danému programu a dotazu. Je-li list LD-stromu označen jako úspěšný, tedy je-li ohodnocen prázdným dotazem, potom prohledávání končí a výstupem je odpovídající vypočtená odpovědní substituce. Žádost o další řešení příkazem ; (středník) vede k obnovení prohledávání od posledního úspěšného uzlu dokud není nalezen nový úspěšný uzel. V případě, že daný LD-strom již neobsahuje žádný další úspěšný uzel, je neúspěch prohledávání avizován výstupem no. Logické programování 9 13 Navracení v LD-stromu * * fail Logické programování 9 14

Příklady. a) Mějme následující program P 1 : p q. p. q r. q s. a jeho LD-strom pro dotaz p. Logické programování 9 15 p q r s. fail fail LD-strom pro P 1 {p} úspěšným listem. je konečný se dvěma neúspěšnými a jedním Logické programování 9 16

Konstrukce LD-stromů nebo dokonce prologovských stromů je pouhá fikce. Vyhledávání odpovědí na dotazy v čistém Prologu je prohledávání do hloubky odpovídajícího LD-stromu. V Prologu jsou jistá omezení konstrukce prologovského stromu. Konstrukce prologovského stromu krok za krokem je jen abstrakcí tohoto procesu. Pro naše účely však postačí. Konstrukce prologovského stromu (krok za krokem) pro dotaz Q generuje posloupnost postupně vybíraných uzlů. Tyto uzly odpovídají odpovídají uzlům, které jsou postupně navštěvovány v průběhu prohledávání odpovídajícího LD-stromu s jediným rozdílem, navracení k rodičovskému uzlu je neviditelné. Jak víme, pro každý dotaz Q a program P existuje právě jeden LD-strom pro P {Q}. Je-li dán program P adotaz Q, zavedeme následující terminologii: Logické programování 9 17 Říkáme, že dotaz Q vždy zakončuje výpočet (universally terminates), je-li LD-strom pro P {Q} konečný. Například dotaz path(x, c) generuje konečný (a uspěšný) LD-strom pro PATH {path(x, c)}, který je zobrazen Obr. 1. Podobně dotaz path(c, X ) vždy (univerzálně) zakončuje i když odpovídající strom je neúspěšný, (Obr. 1a). Q diverguje, jestliže v LD-stromu existuje nekonečná větev vlevo od všech úspěšných uzlů. Například dotaz path(x, Z ) diverguje v pozměněném programu PATH (Obr. 2). Q potenciálně diverguje, jestliže v LD-stromu pro P {Q} existuje úspěšný uzel, takový, že - všechny větve nalevo od něj jsou konečné, - napravo od něj existuje nekonečná větev (Obr. 3). Logické programování 9 18

Q generuje nekonečně mnoho odpovědí, jestliže LD-strom pro P {Q} má nekonečně mnoho úspěšných uzlů a všechny nekonečné větve leží napravo od nich. (Obr. 4) Q selhavá, jestliže LD-strom pro P {Q} konečně selhává. Příklad. Uvažujme program PATH 1. path(x, Z) arc(x, Y), path(y, Z). 2. path(x, X). 3. arc(b, c). Logické programování 9 19 path(x,c) {X 1 /X, Z 1 /c} 1 2 arc(x,y), path(y,c) {X/c} {X/b, Y/c} 3 path(c,c) {X 2 /c, Z 2 /c} {X 2 /c} 1 2 arc(c,y 2 ), path(y 2,c) (neúspěch) Obr. 1 Logické programování 9 20

path(c,x ) {X 1 /c, Z 1 /X} 1 2 arc(c,y), path(y,c) (neúspěch) {X/c} Obr. 1a Změníme-li pořadí atomů v kaluzuli 1. dostaneme program PATH 1. path(x, Z) path(y, Z), arc(x, Y). 2. path(x, X). 3. arc(b, c). V tomto programu dotaz path(x, Z ) diverguje. Logické programování 9 21 path(x,z) {X 1 /X, Z 1 /Z} 1 2 path(y,z ), arc(x,y ) {X 1 /X, Z 1 /X} {X 2 /Y, Z 2 /Z} 1 path(y, Z ), arc(y, Y), arc(x,y ) {X 2 /Y, Z 2 /Z} {X 2 /Y} 1 2 path(y, Z ), arc(y, Y), arc(y, Y), arc(x,y ) nekonečná větev Obr. 2 Logické programování 9 22

neúspěch úspěch úspěch... nekonečná větev Obr. 3 Potenciální divergence Logické programování 9 23 nekonečná větev Dotaz produkující nekonečně mnoho odpovědí Obr. 4 Logické programování 9 24