Logické programování

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

Logické programy Deklarativní interpretace

Logika a logické programování

Modely Herbrandovské interpretace

Matematická logika. Miroslav Kolařík

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á logika - opakování

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

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

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

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

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

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

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

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

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

Tableaux metody. Jiří Vyskočil 2011

Programování v čistém Prologu

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

Rezoluční kalkulus pro výrokovou logiku

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

Matematická logika. Miroslav Kolařík

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

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

popel, glum & nepil 16/28

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

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

Logické programování I

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

6. Logika a logické systémy. Základy logiky. Lucie Koloušková, Václav Matoušek / KIV. Umělá inteligence a rozpoznávání, LS

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

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

Základy logiky a teorie množin

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

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

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

Logika. 8. Automatické dokazování v predikátové logice (obecná rezoluční metoda)

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

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

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 - III

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

Logické programování

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

Predikátová logika. Z minula: 1. jazyk logiky 1. řádu. 2. term a formule. 3. interpretace jazyka (relační struktura) 4. Tarského definice pravdy

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

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

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

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

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 α

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

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

Úvod do TI - logika Výroková logika - pokračování (3.přednáška) Marie Duží

Hilbertovský axiomatický systém

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

Logika Libor Barto. Výroková logika

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

3.10 Rezoluční metoda ve výrokové logice

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

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

Predikátová logika [Predicate logic]

Predikátová logika Individua a termy Predikáty

4.2 Syntaxe predikátové logiky

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

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

Základní pojmy matematické logiky

Místo pojmu výroková formule budeme používat zkráceně jen formule. Při jejich zápisu

Aplikace: Znalostní báze

Cvičení 4. negace konjunkce disjunkce implikace ekvivalence. a) Najděte UDNF, UKNF a stanovte log. důsledky. 1) [p (p q)] [( p q) (q p)]

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

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

Úvod do informatiky. Miroslav Kolařík

Marie Duží

Okruh č.3: Sémantický výklad predikátové logiky

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

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

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

LOGIKA VÝROKOVÁ LOGIKA

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

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

Seminární práce z Teorie ICT

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

(zkráceně jen formule), jestliže vznikla podle následujících pravidel:

Matematická indukce, sumy a produkty, matematická logika

Programovací jazyk Prolog

Převyprávění Gödelova důkazu nutné existence Boha

Výroková logika. Sémantika výrokové logiky

Matematická logika. Rostislav Horčík. horcik

Logika. 6. Axiomatický systém výrokové logiky

1 Základní pojmy. 1.1 Množiny

Matematická logika. Rostislav Horčík. horcik

Matematická logika. Miroslav Kolařík

Sémantika predikátové logiky

Rezoluce ve výrokové logice

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

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

7 Jemný úvod do Logiky

1. Matematická logika

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Matematická logika. Rostislav Horčík. horcik

Transkript:

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

Prolog a Logické programování Prolog vznikl jako programovací jazyk v Marseille 1970, jeho autorem je Alain Colmerauer, implementován byl jeho skupinou. Logické programování jako obecnější interpretaci odvozovacího mechanismu Prologu v predikátové logice zavedl Robert Kowalski v roce 1974. V obou případech se jedná o Deklarativní programování Logické programování 1 2

Co můžeme čekat od Prologu? V příkladech. Příklad 1. Databáze leteckých spojení. direct(amsterdam, seattle). direct(amsterdam, paramaribo). direct(seattle, anchorage). direct(anchorage,fairbanks). connection(x,y) :- direct(x,y). connection(x,y) :- direct(x,z), connection(z,y). Logické programování 1 3

Dotazy: Je spojení z Amsterodamu do Fairbanks??- connection(amsterdam,fairbanks). yes Kam se dá letět ze Seattlu??- connection(seattle,x). X = anchorage ; X = fairbanks ; no Dá se někam letět z Fairbanks??- connection(fairbanks,x). no Logické programování 1 4

Poučení: - stejný program může odpovídat na různé dotazy -program může sloužit jako databáze (zde dokonce v Datalogu) Příklad 2. Hledání společných prvků dvou seznamů. (po jednom prvku) member(x,[x List]). member(x,[y List] : member(x,list). member_both(x,l1,l2) :- member(x,l1), member(x,l2).?- member_both(x,[1,2,3],[2,3,4,5]). X = 2 ; x = 3 ; no Logické programování 1 5

Testování?- member_both(2,[1,2,3],[2,3,4,5]). yes Nalezení vhodné instance?- member_both(2,[1,2,3],[x,3,4,5]). X = 2 Logické programování 1 6

Příklad 3. Zvláštní čtverce. Druhá mocnina čísla 45 je 2025. Když rozdělíme cifry na dvě stejné části, dostaneme 20 a 25, a platí 20 + 25 = 45. Hledání podobných čísel v Prologu je pouhé rozepsání definice. K tomu potřebujeme dvě proměnné N, Z pro hledáné číslo a pro jeho druhou mocninu. Program by mohle vypadat třeba takhle: sol(n,z) :- between(10,99,n), Z is N*N, Z > 1000, Z // 100 + Z mod 100 =:= N. Relace between(x,y,z) platí když číslo Z je mezi X a Y, tedy když X < Z < Y. Logické programování 1 7

Řešení:?- sol(n,z). N = 45, Z = 2025; N = 55, Z = 3025; N = 99, Z = 9801; no Logické programování 1 8

Jiná využití programu:?- sol(55,3025). yes?- sol(55,z). Z = 3025 yes?- sol(44,z). no Logické programování 1 9

Problémy s Prologem - každý program (nejen v Prologu) může být použit špatným způsobem. - aritmetika v Prologu je neohrabaná a může vést k mnoha problémům. -některé programy v Prologu jsou beznadějně neefektivní. a) zakončování výpočtů (smyčky): K příkladu 1 stačípřidat fakt direct(seattle,seattle). přidáme-li ho na konec programu, dotaz?- connection(seattle,x). generuje opakovaně všechna řešení. Logické programování 1 10

Naopak, přidáme-li tento fakt na začatek, dostaneme?- connection(seattle,x). X = seattle ; X = anchorage; X = seattle ; X = anchorage; atd. Odpověď X = fairbanks nebude nikdy generována. Vyměníme-li pořadí pravidel definujících relaci connection a fakt direct(seattle,seattle). přidáme na konec programu, opakovaně je generována jen jedna odpověď. Logické programování 1 11

?- connection(seattle,x). X = fairbanks ; X = fairbanks ; atd. Uvedené příklady ukazují jak je snadné generovat nekončící výpočty. b) Konflikt proměnných v literatuře známý pod anglickým názvem Occur-check Problem. Jestliže ve druhém příkladu testujeme zda proměnná X se vyskytuje v seznamu sestávajícímu ze dvou položek f(x) a X dotazem?- member(x,[f(x),x]),dostaneme nekončící výpočet, který generuje odpověď X = f(f(f(f(f(... Logické programování 1 12

V Prologu proměnné nabývají hodnoty prostřednictvím unifikačního algoritmu. Ten je pro zrychlení výpočtu zjednodušen vynecháním takzvaného testu výskytu (konfliktu) proměnných. Unifikační algoritmus nezjistí, že proměnná X je podslovem výrazu f(x)a snaží se oba výrazy unifikovat dosazováním f(x)za X. c) Aritmetika je teorie mimo logiku a k implementaci Prologu byla přidána velmi okleštěným způsobem. Ve třetím příkladu jsme záměrně vynechali definici relace between. Kdybychom se i zde opírali o deklarativní charakter programů, očekávali bychom, že tato relace bude definována pravidlem between(x,y,z) :- X < Z, Z < Y. Ovšem relace < použitá v definici je v aritmetice Prologu vyhodnocena jen v případě, že oba argumenty jsou přirozená čísla. Logické programování 1 13

Proto v Prologu musíme tuto relaci definovat programem (předpokládáme že v okamžiku volání relace X < Y jsou hodnoty obou proměnných přirozená čísla, a to je v daném příkladu splněno). between(x,y,z):- X < Y, Z is X. between(x,y,z):- X < Y, X1 is X+1,between(X1,Y,Z). V aritmetických výrazech nelze použít složitější aritmetické termy?- between(x,x+10,z). {INSTANTIATION ERROR: in expression} d) Neefektivnost. Pravidlo sorted(list,out) :- permutation(list,out),ordered(out). Je jednoduchým programem, který má uspořádat seznam přirozených čísel. Logické programování 1 14

Jeho neefektivnost je na první pohled zřejmá, je to program typu generuj a testuj. Přesto je velmi oblíbený jako standard při testování efektivnosti různých implementací. Není obtížné najít další příklady neefektivních Prologovských programů. Stačíjen přepsat některé definice relací jako program. Tyto příklady ukazují, že chceme-li psát efektivní programy v Prologu, nestačí jen myslet deklarativně. Je třeba něco vědět o procedurální interpretaci programů, tedy o tom, jakým způsobem Prolog vyhodnocuje dotazy. Logické programování 1 15

Logické programování. Proč počítá Prolog? Výpočty Prologu jsou prováděny pomocí strojového dokazování ve fragmentu logiky prvního řádu. Logické programování je teorie, která se touto složkou podrobně zajímá. Prolog ovšem obsahuje rysy, které přesahují rámec logiky prvního řádu, mají charakter operátorů, to znamená že jsou to funkce, které pracují s formulemi, například neúspěch formulí. řez fail konec prohledávání stavového prostoru odvozených! dovoluje definovat jistý druh negace not(p(x)) :- not(p(x)). p(x),!, fail. Logické programování 1 16

volání call(p(x)) procedury na výpočet dotazu na p(x). seznam všech řešení findall(...,list) Jde o operátory, které lze přidat přidat při implementaci (někdy velmi jednoduše). Navíc, je přidána Aritmetika, která není součástí logického odvozování. Těmito operátory se zatím nebudeme zabývat. Logické programování je teorie, která podrobně zkoumá logické odvozování v Prologu. Je poněkud obecnější než samotný Prolog. Značení a konvence. Jazykobsahuje proměnné x, y, z, x 1, x 2, x 3,... logické spojky (implikace) a, (konjunkce) Logické programování 1 17

funkční symboly f, g, h, f 1, f 2,... predikátové symboly p, q, r, p 1, p 2,... Syntax a) termy (jako obvykle) (i) každá proměnná je term. (ii) je-li f n-ární funkční symbol a t 1, t 2,..., t n termy, potom f (t 1, t 2,..., t n ) je term. jsou Abychom odlišili termy od termů v jazyku Prologu, používáme jiné písmo, proměnné označujeme malými písmeny Logické programování 1 18

b) formule (i) je-li p n-ární predikátový symbol a t 1, t 2,..., t n jsou termy, potom p(t 1, t 2,..., t n ) je atomická formule, říkáme jí atom. (ii) jsou-li H, B 1, B 2,..., B n atomy potom H B 1, B 2,..., B n je formule, říkáme jí definitní klauzule. Atomu H říkáme hlava a n-tici atomů B 1, B 2,..., B n říkáme tělo klauzule. Někdy píšeme krátce H B (v angličtíně je to dokonce mnemotechnické). (iii) jsou-li A 1, A 2,..., A n atomy, říkáme této n-tici dotaz. Někdy píšeme krátce A. Logické programování 1 19

Z logického nadhledu. Formule a termy, které jsme definovali, patří do fragmentu predikátové logiky prvního řádu, které se říká Hornova logika. Výpočet logického programu provádí strojový dokazovač resoluční metodou. Resoluční metoda dokazování postupuje dokazováním sporu. Z logiky připomeňme: Je-li T množina formulí (předpokládáme, že je konečná) a S je formule (můžeme předpokládat, že je uzavřená), víme že platí T - S právě když T { S} je sporná množina Spornou množinu formulí na pravé straně označíme T. Můžeme předpokládat, že T sestává z jediné formule, sestrojíme-li konjunkci všech jejích formulí. Logické programování 1 20

Můžeme předpokládat, že T je uzavřená formule (Věta o uzávěru) a že je v prenexním tvaru (Věta o prenexních tvarech). Máme tedy formuli tvaru Q 1 x 1 Q 2 x 2... Q n x n B (1) kde B je otevřená formule a Q i pro i, 1 < i < n jsou kvantifikátory. Existenční kvantifikátory v prefixu můžeme eliminovat pomocí Skolemovských funkcí, například Formuli x y A(x,y) můžeme nahradit formulí x A(x,h(x)), pokud rozšíříme jazyk o nový funkční symbol h a přidáme axiom A(x,h(x)). Připomeňme Skolemovu větu, každou teorii lze konzervativně rozšířit do otevřené teorie T, (kterou lze v našem případě představit jako jedinou formuli). Logické programování 1 21

Formuli T lze uzavřít a opět převést do tvaru podobného formuli (1) Τeď zbývá převést otevřenou formuli B normálního tvaru. x 1 x 2... x m B (2) do konjunktivního Pro úplnost definujeme literály a klauzule, literál je atomická formule (atom) nebo negace atomu. Klauzule je disjunkce literálů. Protože platí - x(c & D) ( x C & x D) můžeme universální kvantifikátory z prefixu formule (2) distribuovat k jednotlivým klauzulím. Nakonec dostaneme konjunkci klausulí tvaru (... )(L 1 L 2... L k ) Protože konjunkce je asociativní, a tedy na uzávorkování nezáleží, můžeme konjunkci klausulí chápat jako množinu klauzulí. Prefix universálních kvantifikátorů se obvykle nepíše. Logické programování 1 22

Implicitní universální uzávěr dává klausuli řadu vlastností: platí-li klausule, potom platí každá její instance, přejmenováním proměnných (některých nebo všech) vznikne varianta dané klausule, která je s ní ekvivalentní, použijeme-li ve dvou různých klausulích stejnou proměnnou, tyto proměnné kromě jména spolu nemají nic společného, každou z nich lze přejmenovat. Při výpočtu mohou nabývat různých hodnot. Logické programování 1 23

Hornova logika V logickém programování používáme jen klausule speciálního typu (Hornovy klauzule). Jsou to klausule, které mají nejvýš jeden positivní literál. Mohou mit dva tvary: jsou-li H, B 1, B 2,..., B n atomy, potom klausule je ekvivalentní implikaci c H B 1 B 2... B n x 1 x 2... x k (B 1 & B 2 &... & B n H) (3) kde x 1, x 2,..., x k jsou všechny proměnné v klausuli c. Takové klausuli říkáme definitní.a stejně nazýváme implikaci v závorce formule (3). Logické programování 1 24

Podobně klausule je ekvivalentní formuli c A 1 A 2... A n x 1 x 2... x k (A 1 & A 2 A n ) (4) Formuli (4) chápeme jako negaci dokazované formule x 1 x 2... x k (A 1 & A 2 A n ) (5) která je dotazem, zda existuje instance kvantifikovaných proměnných, která by splňovala všechny podmínky v konjunkci formule (5). Logické programování 1 25

V logickém programování používáme čárku místo symbolu & pro konjunkci a implikační šipku místo :-. Definice Dotaz je konečná posloupnost atomů, Klausule je výraz tvaru H B kde H je atom a B je dotaz, atom H nazýváme hlavou a výraz B tělem klauzule, Program je konečná množina klauzulí. V zápise vynecháváme kvantifikátorové prefixy a obrácený směr implikační šipky je motivován tím, že je-li například H p(t), klauzuli H B chápeme jako součást definice predikátu p. Logické programování 1 26

Při analýze důkazů budeme ještě používat výrazy tvaru A B kde A i B jsou dotazy. Takové výrazy budeme nazývat rezultanty. Značení Atomy označujeme symboly A, B, C, H... Dotazy značíme Q, A, B, C,... Klausule c, d,... Rezultanty R... Programy P... Speciálně prázdný dotaz označujeme symbolem [] a je-li B prázdný dotaz, místo H B píšeme H tomuto výrazu říkáme jednotková klauzule. Logické programování 1 27

V našem případě, je-li dán program P a dotaz Q rezoluční výpočet začíná dotazem Q A 1, A 2,, A n s vybraným atomem A i pro nějaké i, 1 < i < n. Je-li v programu klauzule H B 1,, B k taková, že její hlava se shoduje s vybraným atomem, odvodíme nový dotaz (rezolventu) Q 1 tvaru A 1,..., A i-1,b 1,, B k, A i+1, A n (6) V obecném případě, hledáme unifikační substituci θ takovou, že po její aplikaci na oba atomy dojde ke shodě, tedy H θ A i θ. V takovém případě rezolventa (6) vypadá takto (A 1,..., A i-1,b 1,, B k, A i+1, A n ) θ (7) kde do každého atomu dotazu (6) dosadíme za jeho proměnné podle substituce θ = {x 1 /t 1,, x k /t k } kde (t i jsou termy). Logické programování 1 28

Úspěšný výpočet pokračuje stejnými kroky až do odvození prázdného dotazu []. Přitom sestrojíme složenou substituci θ 1 θ 2... θ m (8) která dává odpověď, jaké termy máme dosadit za proměnné dotazu Q, aby všechny jeho atomy byly splněny. Přirozeně, ne každý dotaz a každý program vedou k úspěšnému výpočtu. Ten může skončit neúspěchem. Při volnosti výkladu, kterou jsme si dovolili, při úspěšném výpočtu můžeme prázdný dotaz považovat za prázdnou konjunkci a ztotožnit ji s Booleovskou konstantou true (všechny její atomy jsou splněny). Nebo můžeme prázdný dotaz považovat za prázdnou disjukci a ztotožnit ji s hodnotou false (žádný její atom není splněn). A považovat výpočet za důkaz sporu. Substituci dostaneme (8) v obou případech. Logické programování 1 29

Tento exkurs do predikátové logiky jsme si dovolili především proto, abychom ukázali, že logické programování má solidní základ v logice a také proto, abychom ukázali, co nás čeká. Pro začátek je nejdůležitější si uvědomit, že v logickém programování nabývají proměnné svých hodnot speciálními substitucemi a úspěšný výpočet vydává složenou substituci, která obsahuje řešení problému formulovaného v dotazu Q. Rezoluční metodu vytvořil J. A. Robinson v roce 1962 pro množiny obecných klauzulí. Vyřešil problém, jaké substituce je třeba používat a vytvořil algoritmus, jak je sestrojit. A. Horn je v rezoluci nevinně, z jeho výsledků dosažených již v roce 1951 mimo jiné vyplývá, že je-li každá klausule v programu bezesporná, potom je bezesporný celý program. Spor může být do úlohy vnesen jen dotazem. Logické programování 1 30