200 likes | 405 Views
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
E N D
Ciao prolog Kontra Gergely kgergely@mcl.hu
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
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
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
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.
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)
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
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ő
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
:-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.
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),…
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).
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 ?
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
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 }?-
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.
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.
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
Köszönöm a figyelmet ! ! ? ? ? ? ! ! ?