Meta-programozás (von) Neumann-elv Program-programozás (vírusok) Programállapotot befolyásoló (önprogramozó) beépített eljárások
Beépített eljárások: dinamikus programkezelés Dinamikus predikátum direktíva : :- dynamic(NAME/NARGS). Új klózok felvétele: asserta(CLAUSE), assertz(CLAUSE) Példa: ?-assertz((p(1,X):-q(X))), asserta(p(2,0)), assertz((p(2,Z):-r(Z))), listing(p). p(2,0). p(1,A):-q(A). p(2,A):-r(A).
retract(CLAUSE) kitörli a CLAUSE mintára illeszkedő klózt retract(CLAUSE) kitörli a CLAUSE mintára illeszkedő klózt. Nemdeterminisztikus!! ?-retract((p(2,_):-_)), listing(p), write(----------), nl, fail. p(1,A):-q(A). p(2,A):-r(A). ------------- p(1,A):-q(A). ------------- retractall(HEAD) kitörli a HEAD-fejre illeszkedő összes klózt retractall(HEAD):- retract((HEAD:-_)), fail. retractall(_).
Klóz keresése/lekérdezése programból… clause(+HEAD,?BODY). Megvizsgálja, hogy létezik-e HEAD fejű és BODY testű klóz. Nemdeterminisztikus!! PÉLDA: Metainterpreter (Prolog interpreter Prologban)… %mode meta(:GOAL). meta(true):- !. meta((G1,G2)):- !, G1, G2. meta((G1;G2)):- !, (G1; G2). meta(G):- clause((G,GS)), meta(GS). Megjegyzések: 1. Nem kezel beépítetteket 2. Nem definiált predikátumokra hamisat ad 3. Nem kezel vágót 4. Csak dinamikusokra működik
Meta-példa: nyomkövetés trac(GOAL):- trac(GOAL,1). %trac(:GOAL,+INDENT) trac(true,_):- !. trac((G1,G2),I):- !, trac(G1,I), trac(G2,I). trac((G1;G2),I):- !, (trac(G1,I); trac(G2,I)). trac(G,I):- ( trac(GOAL,I,'>'); trac(GOAL,I,'-'), fail ), I2 is I+2, clause(G,GS), trac(GS,I2), ( trac(GOAL,I,'+'); trac(GOAL,I,'<'), fail ). ÉS, VAGY, true nincs nyomkövetve
%mode trac(?GOAL,+INDENT,+PORT). trac(GOAL,INDENT,PORT):- tab(INDENT), write(PORT), write(GOAL), nl.
Összes megoldás keresése Tiszta Prologban (nem korlátozott számú) alternatív megoldások nem foghatók listába (Tiszta SQL-ben (nem korlátozott számú) külön sorokban levő adat nem fogható egy rekordba) mocskos Prolog (programkezelő beépítettekkel) magasabb rendű eljárások (amikor az eljárás maga is paraméter) findall(?Template,:Goal,?Bag). - Template: a Goal része - Goal: meghívható hívás-sorozat - Bag: Template alternatív lekötéseiből alkotott lista (Bag!)
Pl: nap(‘hétfő’). nap(kedd). nap(szerda). nap(‘csütörtök’). nap(‘péntek’). nap(szombat). nap(‘vasárnap’). ?-findall(X,nap(X),HET). HET=[‘hétfő’,kedd,szerda,’csütörtök’,’péntek’, szombat,’vasárnap’]
findall/3 megvalósítása %mode forAll(:PRE,:CONS). forAll(PRE,CONS):- \+ (PRE, \+ CONS). :- dynamic all/1. %mode findAll(?VAR,:GOAL,?BAG). findAll(VAR,GOAL,BAG):- forAll(GOAL,assert(all(VAR))), collectAll(BAG). %mode collectAll(?BAG) collectAll(BAG):- retract(all(X))->BAG=[X|TAIL], collectAll(TAIL); BAG=[].
Szakértő rendszerek 1. Tudásvezérelt (knowledge driven) rendszerek. A tudásállomány: a program többi részétől jól elkülönült deklaratív jellegű tudásállomány (az ábrázolt világ vmilyen modellje) a modell eredendően hiányos, esetleg ellentmondásos növelhető/csökkenthető méretű, + Tudás karbantartó alrendszer (szerkesztő, begyűjtő, ellentmondás feloldó stb. „knowledge acquisition”) + kiértékelő/végrehajtó/értelmező /következtető motor (engine) + Magyarázatadó alrendszer (explanation)
Barkochba program: nano szakértő rendszer Tudásállomány: szabályok: állat(X):-nyávog(X) tények: állat(egér). Egy definíció mindig n-1 szabályból+1 tényből áll Motor: metainterpreter, amely a feltételek kérdéseire párbeszédes választ vár utolsó állításnál rákérdez Tudásbegyűjtő: ha a rákérdezés sikertelen volt, akkor újabb feltételekkel bővíti a definíciót…
megkeres(CALL,X):- clause(CALL,BODY), ( BODY=true->write(CALL), write('?'), nl, read(igen), !; write(BODY), write('?'), nl, read(igen), !, megkeres(BODY,X) ); write('Hogy hívják?'), nl, read(X), write('Miben különbözik?'), nl, read(TUL), CALL=..[NAME|_], HEAD=..[NAME,Y], BODY=..[TUL,Y], LASTFACT=..[NAME,_], retract(LASTFACT), assert((HEAD:-BODY)), assert(LASTFACT), FACT=..[TUL,X], assert(FACT). start:- assert(allat(macska)), repeat, megkeres(allat(X),X), write(X), nl, write('Folytassam?'), nl, \+ read(igen), !.
Mi hiányzik a Barkochbából? (1. Kezdeti tudásbázis betöltés/kiírás.) 2. Magyarázatadás. Keresési fa: csomópontjai célsorozatok, élei redukciós műveletek. HOW/Hogyan? magyarázat a keresési fa teljes bejárt részét megjeleníti (gyakorlatilag offline/postmortem trace nem kiírja, hanem összegyűjti… WHY/Miért? Magyarázat csak a gyökértől a sikeres végpontig vezető utat jeleníti meg…
Programbetöltés consult(FILENAME) fájl klózait betölti Felhasználónak kell definiálnia! term_expansion(+Term1, -Term2) A Term1 beolvasott kifejezés Term2-be történő átalakítását vezérli (Term2 kerül betöltésre). (Prolog makrókifejtés). Ha Term2: :- GOAL vagy ?- GOAL formájú, akkor direktívaként értelmezi. Ha Term2 lista, akkor mindet betölti. goal_expansion(+Goal1, -Goal2) A Goal1 beolvasott kifejezés Goal2-be történő átalakítását vezérli. Csak tényleges célsorozatokra, ill. metahívások argumentumaira van meghíva. Használat: Definite Clause Grammar (DCG) nyelvtandefiníciós eszköz…
(Csatorna) I/O see(FILE) megnyitás olvasásra seen olvasás bezárása tell(FILE) megnyitás írásra told írás bezárása read(EXPR) Prolog kifejezés olvasása write(EXPR) Prolog kifejezés írása nl Soremelés
„Miért” magyarázat… állat(X):-tollas(X). állat(X):-vízbenÉl(X). állat(macska). tollas(X):-repül(X). tollas(X):-fut(X). tollas(tyúk). fut(strucc). Megoldás: a ‘Megkeres’ egy újabb paraméterben gyűjti az elvégzett következtetési lépések listáját. Vigyázat! Tudásbázis kiterjesztéskor is!! EZ A FELADAT!!