1 / 20

Ciao prolog

Ciao prolog. Kontra Gergely kgergely@mcl.hu. Ciao prolog komponensek. Ciao prolog kiterjesztések. Globális változók Setarg és undo Végrehajtás késleltetés Párhuzamos programozás (&-Prolog szerű) Funkcionális szintaxis Magasabb rendű könyvtárak Aktív modulok Szélességi bejárás

talen
Download Presentation

Ciao prolog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ciao prolog Kontra Gergely kgergely@mcl.hu

  2. Ciao prolog komponensek

  3. Ciao prolog kiterjesztések • Globális változók • Setarg és undo • Végrehajtás késleltetés • Párhuzamos programozás (&-Prolog szerű) • Funkcionális szintaxis • Magasabb rendű könyvtárak • Aktív modulok • Szélességi bejárás • Fokozatosan mélyülő bejárás (iterative deepening) • CLP • OO

  4. Ciao prolog és a külvilág • Külső interfészek (pl. C-hez) • Socket • Tcl/tk • Web • Perzisztencia (prolog adatbázis fájlban) • SQL-szerű adatbázis interfész (SQL/ODBC) • Java interfész • Emacs interfész

  5. Assert deklarációk – miért használjuk? • Futás közbeni ellenőrzés • Orákulum (felhasználó) helyett • Fordítási időben (típus)ellenőrzés • Jobb fordítást eredményez (ezeket nem mi írjuk, hanem a fordító) • „Párbeszéd” a fordítóval (feltételek, melyeknek teljesülniük kéne, és amelyek valóban teljesülnek) • Program dokumentálása

  6. Assertions • pred deklaráció:- use_package([assertions]).:- pred length(L,N) : list * var => list * integer # "Computes the length of L.".:- pred length(L,N) : var * integer => list * integer # "Outputs L of length N.".:- pred length(L,N) : list * integer => list * integer # "Checks that L is of length N.".length([],0).length([_|L],N) :- length(L,N0), N is N0 + 1.

  7. Assertions II. • calls –előfeltétel:- calls is(term,arithexpression). • success – pred + nem hiúsul meg:- success length(L,N) : list * var => list * integer. • comp – végrehajtás tulajdonságai:- comp append(Xs,Ys,Zs) : var * var * var +not_fail. • prop – olyan predikátum, amely biztosan lefut, nincs mellékhatása és nem köt le változókat, így használható futás idejű ellenőrzésre • entry – predikátum külső meghívásaezekben az állításokban a fordító megbízik!!! • Comment – program dokumentálás:-comment(Pred,Comment)

  8. Assertions III. • modedef – hívási módok:- modedef +A : nonvar(A) # "A is bound upon predicate entry.".:- pred p(+A,B) : integer(A) => ground(B).??? • decl – pred deklarációkban • check – futásidejű programellenőrzés • trust – Extra információ a fordítónak A FORDÍTÓ HISZ NEKÜNK  • true és false – analízis kimenete

  9. Properties I. • :- use_package(nativeprops). • program analízishez kell • linear(X) – nincs függőség a változók között • mshare(X) – változók függőségenem jól olvasható, ezért nem használják • fails(X) – az X alakú hívások meghiúsulnak • not_fails(X) – az X alakú hívások sikerülnek, vagy végtelen ciklus • covered(X) – van legalább egy megoldás • not_covered(X) – van egy olyan X alakú hívás, ami meghiúsul • is_det(X) – minden X hívás max. egy megoldást ad • possibly_nondet(X) • mut_exclusive(X) – csak az egyik klózra illeszthető • not_mut_exclusive(X) – van, hogy több klózra illeszthető

  10. Properties II. • steps_lb(X,Y) – X kiszámításához legalább Y rezolúciós lépés kell • steps_ub(X,Y) • sideff_pure(X) – X hívása nem jár mellékhatással • sideff_soft(X) – X hívása csak mérsékelt mellékhatást vált ki, mely a programfutásra nincs komoly kihatással (pl. IO) • sideoff_hard(X) –X hívása mellékhatásos (pl. assert vagy retract) • indep(X) – X változópár-lista, a párokban szereplő változók páronként függetlenek

  11. :-use_module(library(librowser)). ?- browse(M,findall/A).A = 3,M = conc_aggregates ? ;A = 4, M = aggregates ? ;A = 3, M = aggregates ? ; ?- where(findall/A).findall/3 exported at module conc_aggregatesfindall/4 exported at module aggregatesfindall/3 exported at module aggregates ?- describe(librowser).Predicates at library librowser :apropos/1system_lib/1describe/1where/1browse/2update/0 ?- apropos('atom_*').terms: atom_concat/2concurrency: atom_lock_state/2atomic_basic: atom_concat/3,atom_length/2,atom_codes/2iso_byte_char: atom_chars/2 Egyéb fejlesztések I.

  12. Egyéb fejlesztések II. A zebra probléma :- use_package([argnames]).:- argnames house(color, nation, pet, drink, car).zebra(Owns_zebra, Drinks_water, Street) :-Street = [house${},house${},house${},house${},house${}],member(house${nation=>Owns_zebra,pet=>zebra}, Street),member(house${nation=>Drinks_water,drink=>water}, Street),member(house${drink=>coffee,color=>green}, Street),…

  13. Egyéb fejlesztések III. • :- use_module(library(terms_check)). • ask(Term1,Term2). – Term1 és Term2 egyesíthető Term1-ben történő behelyettesítés nélkül • instance(Term1, Term2) – Term1 Term2 egy példányaEz is egy befejezetlen remekmű  • variant(Term1, Term2) – A két term a benne szereplő változóktól eltekintve megegyezik. • :- use_package(andprolog).q :- a & b.Csak akkor működik, ha a és b determinisztikus hívások és a hívások függetlenek. • :- use_module(library(file_locks)).Dokumentáltan nem csinál semmit  • :- use_package(andorra).

  14. Korutinszerű eszközök • :- use_module(library(freeze)). • freeze(X,Goal), frozen(X,Goal) ??? • :- use_module(library(when)). • max(X, Y, Z):- when(ground((X, Y)), gmax(X, Y, Z)). – Max, amely „kivárja a sorát”?- max(X, Y, Z), Z = 5, Y = 4.X = 5, Y = 4, Z = 5 ?

  15. Aktív modulok • Önálló modulok, melyek a speciális fordítástól eltekintve normál modulok • Minden aktív modul egy önálló folyamat (egy kiszolgáló), mely a külvilággal socketen keresztül kommunikál • A távoli folyamatok kérést intéznek hozzájuk, ők küldik a választ • Átlátszó a visszalépésre • Előre kiszámol a modul minden megoldást (hatékonysági okokból, bár ez később még változhat), így nem szabad olyan kérést küldeni, amely végtelen választ eredményez • Biztonsági problémák

  16. Szélességi bejárás • :- module(chain, _, [bf]).test(bf) :- bfchain(a,d).test(df) :- chain(a,d). % loops!bfchain(X,X) <- .bfchain(X,Y) <- arc(X,Z), bfchain(Z,Y).chain(X,X).chain(X,Y) :- arc(X,Z), chain(Z,Y).arc(a,b).arc(a,d). arc(b,c). arc(c,a). • Ciao-Prolog 1.8 #1: Mon May 27 18:10:40 2002?- use_module('d:/tmp/chain.pl').?- test(bf).yes?- test(df).% realloc: Not enough core{ERROR: Memory allocation failed}{ Execution aborted }?-

  17. Fokozatosan mélyülő bejárás • :- use_package(id). • :- iterative(Name, St, Form, [End]).Először csak St mélységig keres megoldást, majd növeli Form kifejezésnek megfelelően, míg el nem éri -et.Például::- iterative(p/1,5,f). f(X,Y) :- Y is X + 10.Először 5 mélységig vizsgálja, majd 10-esével növeli a keresési tér mélységét.

  18. OO – Verem :- class(stack,[],[]).% State declaration: storage/1 is an attribute.:- dynamic storage/1.% Interface declaration: the following predicates will % be available at run-time.:- export(push/1).:- export(pop/1).:- export(top/1).:- export(is_empty/0).% Methods push(Item) :- nonvar(Item), asserta_fact(storage(Item)).pop(Item) :- var(Item), retract_fact(storage(Item)). top(Top) :- storage(Top), !. is_empty :- storage(_), !, fail. is_empty.

  19. OO – Verem használat • Ha a class-t module-ra cseréljük, működőképes modult kapunk! (igaz, hogy akkor egy darab vermünk lesz…) • ?- use_package(objects).?- use_class(library('class/examples/stack')).?- St1 new stack,St2 new stack.St1 = stack('9254074093385163'),St2 = stack('9254074091') ? ,?- St1:push(8),St2:push(9).St1 = stack('9254074093385163'),St2 = stack('9254074091')?- St1:top(I),St2:top(K).I = 8,K = 9,St1 = stack('9254074093385163'),St2 = stack('9254074091') ? • Inherit_class/1, inheritable/1, virtual/1, data/1, export/1

  20. Köszönöm a figyelmet ! ! ? ? ? ? ! ! ?

More Related