Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilRozálie Štěpánková
1
JUI - 9. přednáška Ř ez, negace, práce s databází RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
2
2 Řez Řez je standardní predikát, který se zapisuje jako znak ! (vykřičník) jako jeden z podcílů v těle pravidla. Pomocí řezu můžeme zabránit tomu, aby se při vyhodnocení cíle zbytečně zkoušela použít pravidla, o nichž je předem známo, že již k řešení nevedou. Řez tedy redukuje prohledávací prostor prologovského programu tak, že dynamicky odřezává celé neužitečné podstromy. Význam řezu je možné popsat pouze pomocí procedurální sémantiky programu, takže jeho použitím se od sebe může velmi nebezpečně vzdálit deklarativní a procedurální sémantika. Zelený řez neovlivňuje výslednou množinu řešení cíle a odřezává tedy jen větve neobsahující potenciální řešení, Červený řez zvyšuje efektivnost programu za cenu nesouladu mezi deklarativní a procedurální sémantikou.
3
3 Sémantika řezu Řez má následující sémantiku: bezpodmínečně uspěje fixuje všechny vazby proměnných provedené od unifikace nadřazeného cíle s hlavou pravidla, v němž se řez nachází dojde-li v těle pravidla za řezem k selhání nějakého podcíle, které nejde napravit návraty do podcílů vpravo od řezu, znamená to současně i selhání nadřazeného cíle – žádná další pravidla se pro něj již neuplatní Působením řezu se tedy odstřihnou všechna možná řešení podcílů nacházejících se nalevo od něj a možnost použití všech pravidel dané procedury, která následují za pravidlem obsahujícím řez. Na druhé straně se jím neovlivňuje možné navracení v podcílech nacházejících se napravo od něj. Jakmile by však mělo dojít ke zpětnému návratu před řez, provede se výstup z celé procedury se signalizací neúspěchu cíle.
4
4 Negace Negace je v Prologu vyjádřena standardním predikátem not a její význam můžeme ilustrovat takto: not(X):- call(X),!,fail. not(X). kde fail je standardní predikát, který nelze splnit. Cíl not (X) tedy selže, pokud je cíl X prologovsky splnitelný, a naopak cíl not (X) bude úspěšný, pokud cíl X splnit nelze. Nemožnost splnění cíle může ovšem v Prologu vyvolat zacyklení a pak se zacyklí i vyhodnocení negace, místo aby uspělo. K potížím s negací nedojde, pokud se při vyhodnocení nevyskytují v negovaném cíli nenastavené proměnné. Pozn.: Funktor not je standardně definován jako unární prefixový operátor se stejnou preferencí jakou mají binární operátory + a –, takže není třeba jeho argument dávat do závorek.
5
5 Predikáty consult a reconsult Tyto predikáty zajišťují vstup programu ze souboru. consult(F) Vyhodnocení tohoto cíle způsobí načtení klauzulí všech procedur ze souboru F a jejich uložení do databáze. Stejným způsobem lze načíst procedury z několika souborů, pravidla se ukládají do databáze v tom pořadí, v jakém se četla. Namísto několika volání predikátu consult je možné uvést v jeho argumentu seznam jmen souborů obsahujících program. reconsult(F) Vyhodnocení tohoto cíle má podobný účinek s tím rozdílem, že všechny procedury predikátů uvedené v souboru F nahradí případné dosud platné procedury z databáze.
6
6 Predikáty assert a retract Tyto predikáty umožňují explicitní práci s databází. assert(C) Tento cíl uspěje pouze jednou a jako vedlejší efekt doplní klauzuli C do databáze a to v závislosti na implementaci buď jako první nebo jako poslední v odpovídající proceduře. Predikát asserta doplňovanou klauzuli umístí jako první klauzuli příslušné procedury a predikát assertz ji umísí jako poslední. retract(C) Tento cíl uspěje při nalezení prvé klauzule v databázi, která se unifikuje s klauzulí C, a z databáze ji vypustí. Při opakovaném vyhodnocení uspěje, pokud se v databázi nachází další taková klauzule. Predikát retractall vypustí všechny takové klauzule najednou. Klauzule C se zapisuje takto: fakt nebo (pravidlo)
7
7 Predikát clause Predikát clause zajišťuje nedestruktivní přístup ke klauzulím databáze. Při vyhodnocení cíle clause(Hlava,Tělo) s nastavenou hodnotou proměnné Hlava se hledá v databázi klauzule, jejíž hlava se unifikuje s hodnotou prvního argumentu. Tělo této klauzule se pak unifikuje s druhým argumentem. Při unifikaci faktů se za tělo považuje predikát true. Klauzule z databáze nelze hledat pomocí jejich těla. Při zpětném navracení uspěje predikát clause tolikrát, kolikrát je možné unifikovat klauzuli z databáze se dvojicí argumentů. Při každé unifikaci klauzule se vytváří nová sada proměnných.
8
8 Predikáty bagof, setof a findall Tyto predikáty umožňují získat všechna možná řešení současně. bagof(X,P,L) Vyhodnocením tohoto cíle se vytvoří seznam L všech objektů X takových, že je cíl P splněn (mezi X a P by měla existovat nějaká vazba vyjádřená společnými proměnnými). setof(X,P,L) Funguje podobně jako bagof, avšak seznam L je uspořádaný a bez případných duplicit. Uspořádání je pro atomy abecední, pro čísla podle hodnoty, a pro složené termy se řídí hlavním funktorem (případně nejvyšším rozdílným funktorem nebo argumentem zleva). findall(X,P,L) Funguje podobně jako bagof s tím rozdílem, že do seznamu L se dostanou všechny hodnoty X, které splňují cíl P pro libovolné hodnoty jeho volných proměnných.
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.