(SLD-rezoluce, SLD-stromy, výpočetní mechanismus Prologu, základy programování v Prologu)
Rezoluce –- dokazuje se nesplnitelnost formulí, jsou v KNF, v kořenu je □ a nebo dokazovaná formule C, v listech jsou jednotlivé klauzule S, ve vnitřních listech resolventy
Lineární rezoluce –- jde o posloupnost dvojic , … , takovou, že a
Lineární vstupní rezoluce (LI) množiny je lineární vyvrácení S, které začíná klauzulí G, a bočními klauzulemi jsou jen klauzule z P.
Hornovy klauzule (jsou v Prologu) = klauzule s nejvýše jedním pozitivním literálem (dají se reprezentovat jako implikace)
Typy:
LD rezoluce –- už máme uspořádané klauzule a při rezoluci vkládáme dovnitř. LD rezoluční vyvrácení je postupnost , … , uspořádaných klauzulí taková, že □, a každé , je rezolventou uspořádaných klauzulí a
SLD rezoluce -– lineární vstupní rezoluce se selekčním pravidlem (selekční pravidlo = libovolná funkce, která vybere literál z každé uspořádané cílové klauzule)
: máme množinu klauzulí P a cílovou klauzuli
SLD strom pro program P a cíl G: v kořeni je G. Když je libovolný uzel označený G‘, tak jeho bezprostřední následníci jsou označení výsledkem rezoluce nejlevějšího literálu G‘ se všemi použitelnými klauzulemi z P.
Příklad(2)
Prolog je logický programovací jazyk. Patří mezi tzv. deklarativní programovací jazyky, ve kterých programátor popisuje pouze cíl výpočtu, přičemž přesný postup, jakým se k výsledku program dostane, je ponechán na libovůli systému. Prolog se snaží o pokud možno abstraktní vyjádření faktů a logických vztahů mezi nimi s potlačením imperativní složky. Prolog je využíván především v oboru umělé inteligence a v počítačové lingvistice (obzvláště zpracování přirozeného jazyka, pro nějž byl původně navržen).
Vyhodnocovací mechanizmus Prologu prochází SLD-strom do hloubky zleva doprava a hledá (první) úspěšnou cestu (backtracking) – případně projde celý strom a vyhlásí, že to není možné.
- zadání středníku (;) po úspěšném vyhodnocení čísla vynutíme backtracking a hledání alternativního důkazu
- odpověď „no“ systému znamená, že daný cíl není logickým důsledkem programu (případně že nemá alternativní důkaz) prologovská strategie prohledávání stavového prostoru (do hloubky) může vést k zacyklení (i v případě, že existují úspěšné větve)
Příklad programu, který vede k zacyklení, i když existují úspěšné větve:
q:- r.
r:- q.
q.
?- q.
Logické programování:
Prolog
Wikipedia Prolog - http://cs.wikipedia.org/wiki/Prolog_%28programovac%C3%AD_jazyk%29 Slidy předmětu - http://www.fi.muni.cz/usr/popelinsky/lectures/bak_logika/ Vypracování otázek Elena Halicová - http://www.fi.muni.cz/~xhalic1/statnice/vypracovaneIM.doc
Diskuze
Tuto otázku vypracovala Tereza Dvořáková, já ji sem přepsal. Klidně cokoliv dopište pokud si myslíte, že to sem patří.
mela jsem problem s tiskem teto stranky, tak jsem ji narychlo predelala to pluginu math… kontrolovala jsem to a pevne doufam, ze tam nejsou zadne chybky z toho prepisu.
podle me je v prikladu 2 u SLD stromu chyba… maji totiz byt vsechny literaly v uzlech negovane a ve dvou uzlech nejsou…
Ano v druhem prikladu si taky myslim ze je chyba.
Konkretne ve druhem radku ma byt vysledna formule
[-Q(x,z),-R(z,x)]
a potom se chyba posouva i do tretiho radku.
Je to presne jak pises, nejsou negovane a maji byt.
Akorat ted nevim jak je to s temy neuspechy… tam se nemuze provest substituce?
nezda se mi taky ten priklad u Prologu:
q:=r. r:-q. q. cíl ?- q. - respektive, co v nem znamena to “=“?
nemelo by spis byt:
q:-r.
r:-q.
q.
?- q.
EDIT: uz jsem to nasla ve skriptech.. opravuji na spravne.
Doplním aspoň takto formou diskuze svůj výcuc k jednotlivým druhům rezolucí, který se onehdy snad docela ujal v DF dotyčného předmětu. Narozdíl od toho tady v článku je to založené na tvarech těch rezolučních stromů, což se minimálně mně na první pohled lépe chápe než ty formální definice v textu vypracování otázky:
(požadavky se postupně kumulují - pro každou rezoluci platí i vše uvedené pro ty před ní)
1. Obecná rezoluce - strom, spojuje se „cokoliv s čímkoliv“
2. Lineární rezoluce - všechno je na jedné vìtvi
3. LI rezoluce - první klauzule je cíl z dané množiny (taková, kde jsou všechny literály negativní); boèní (přidávané) klauzule bereme pouze ze vstupní množiny (není možná recyklace dříve vyrezolvovaných)
4. LD rezoluce - klauzule jsou uvnitř uspořádané, takže při rezolvování se dva stejné literály zapíší do výsledku dvakrát
5. SLD rezoluce - literál, na kterém rezolvuju, vybírám z aktuální klauzule podle pravidla (obv. zleva)
Ja by som len chcel jemne poopravit hned na zaciatku tu definiciu Linearnej rezolucie:
1. C0 patri do S a zaroven Bi patri do S alebo Bi = Cj, kde j<i (to znaci to, ze mozme pouzit v rezolucii uz v nejakom predoslom kroku vzniknutu rezolventu)
S klidem to uprav, pokud máš jistotu, že je to dobře. Domnívám se, že studenti kteří toto udržovali v roce 2008, už sem nezavítají.
sjednotte pls nekdo posledni sekci „poznamky“ s odstavci predtim, je tam spousta duplicit…