Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Ciao prolog Kontra Gergely 2 Ciao prolog komponensek ciaoc prolog fordító ciaosh interaktív prolog debugger 4-kapus nyomkövetés, beágyazható.

Hasonló előadás


Az előadások a következő témára: "Ciao prolog Kontra Gergely 2 Ciao prolog komponensek ciaoc prolog fordító ciaosh interaktív prolog debugger 4-kapus nyomkövetés, beágyazható."— Előadás másolata:

1 Ciao prolog Kontra Gergely kgergely@mcl.hu

2 2 Ciao prolog komponensek ciaoc prolog fordító ciaosh interaktív prolog debugger 4-kapus nyomkövetés, beágyazható ciao-shell interpreter/fordító prolog szkriptekhez ciao.el programfejlesztői környezet Emacs-hoz ciaopp preprocesszor (fejlesztés alatt) lpdoc automatikus dokumentáció

3 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 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 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 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 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ása ezekben az állításokban a fordító megbízik!!! Comment – program dokumentálás :-comment(Pred,Comment)

8 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 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ége nem 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 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 11 Egyéb fejlesztések I. :-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_aggregates findall/4 exported at module aggregates findall/3 exported at module aggregates ?- describe(librowser). Predicates at library librowser : apropos/1 system_lib/1 describe/1 where/1 browse/2 update/0 ?- apropos('atom_*'). terms: atom_concat/2 concurrency: atom_lock_state/2 atomic_basic: atom_concat/3, atom_length/2, atom_codes/2 iso_byte_char: atom_chars/2

12 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 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ánya Ez 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 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 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 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 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 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 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 ? ? ? ?? ! ! ! !


Letölteni ppt "Ciao prolog Kontra Gergely 2 Ciao prolog komponensek ciaoc prolog fordító ciaosh interaktív prolog debugger 4-kapus nyomkövetés, beágyazható."

Hasonló előadás


Google Hirdetések