Použitie prologu na tvorbu expertných systémov

Možnosti použitia prologu pri vývoji expertných systémov sú:
  1. priamo napísať systém v štandardnom prologu
  2. použitie prologu ako implementačného jazyka pre interpret nejakého iného jazyka reprezentácie znalostí, ktorý môže byť natoľko vzdialený od prologu, koľko je potrebné
  3. rozšírenie jazyka prolog a potom jeho priame použitie na implementáciu expertného systému

1. Priame použitie prologu


2. Prolog a meta-interpret

Tento prístup sa hodí vtedy, ak potrebujeme reprezentáciu znalostí a/alebo riadiace stratégie odlišné od tých, ktoré sú vstavané v prologu.

Interpret je program napísaný v jazyku LI s touto vlastnosťou: keď sa program I vykonáva s iným programom P napísanom v jazyku LP ako vstupom, správa sa rovnako ako keby sa P vykonával priamo na programovom stroji, ktorý spúšťa programy napísané v LP.
Ak LI=LP, interpret označujeme pojmom meta-interpret.
Prologovský meta-interpret je prologovský program, ktorý spracúva prologovský program.


Meta-interpret "čistého" prologu

solve(true) :- !.
solve((G1, G2)) :- solve(G1), solve(G2).
solve(G) :- clause(G, B), solve(B).

Zmena syntaxe jazyka reprezentácie znalostí

Meta-interpret
:- op(1200, xfx, if).

solve((G1, G2)) :- !, solve(G1), solve(G2).
solve(G) :- G if Body, !, solve(Body).
solve(G) :- call(G).
Báza znalostí
    %všeobecné znalosti
cicavec(X) if má_srsť(X).
mäsožravec(X) if cicavec(X), žerie_mäso(X).
mäsožravec(X) if cicavec(X), pazúry(X, ostré).
zviera(X, tiger) if mäsožravec(X), pruhy(X, čierne).

    %znalosti zvláštneho prípadu problému
má_srsť(punťo).
žerie_mäso(punťo).
pruhy(punťo, čierne).

Odpoveď na otázku 'PREČO?'

Meta-interpret
solve(true,_) :- !.
solve((Goal1, Goal2), Rules) :-
	solve(Goal1, Rules),
	solve(Goal2, Rules).
solve(Goal, Rules) :-
	clause(Goal, Body),
	solve(B, [(Goal :- Body) | Rules]).
solve(Goal, Rules) :-
	askuser(Goal, Rules).

askuser(Goal, Rules) :-
	write(Goal),
        write('? Zadaj true, ak cieľ platí, inak false:'), nl,
	read(Answer),
        process_answer(Answer, Goal, Rules).

process_answer(true, _, _).
process_answer(prečo, Goal, [Rule | Rules]) :-
	write('   '), write(Rule), nl,
	askuser(Goal, Rules).
process_answer(prečo, Goal, []) :-
	askuser(Goal, []).
Báza znalostí
    %všeobecné znalosti
cicavec(X) :- má_srsť(X).
mäsožravec(X) :- cicavec(X), žerie_mäso(X).
mäsožravec(X) :- cicavec(X), pazúry(X, ostré).
zviera(X, tiger) :- mäsožravec(X), pruhy(X, čierne).

    %znalosti zvláštneho prípadu problému
má_srsť(punťo).
žerie_mäso(punťo).
pruhy(punťo, čierne).
Príklad inferencie
?- solve(zviera(jack, tiger), []).
má_srsť(jack)? Zadaj true, ak cieľ platí, inak false:
prečo
   cicavec(jack) :- má_srsť(jack)
má_srsť(jack)? Zadaj true, ak cieľ platí, inak false:
prečo
   mäsožravec(jack) :- cicavec(jack)
má_srsť(jack)? Zadaj true, ak cieľ platí, inak false:
prečo
   zviera(jack, tiger) :- mäsožravec(jack), pruhy(jack, čierne)
.......


Odpoveď na otázku 'AKO?'

Meta-interpret
solve(true, true) :- !.
solve((Goal1, Goal2), (Proof1, Proof2)) :-
	solve(Goal1, Proof1),
	solve(Goal2, Proof2).
solve(Goal, (Goal :- ProofB)) :-
	clause(Goal, Body),
	solve(B, ProofB).
solve(Goal, (Goal :- given)) :-
	askuser(Goal).

askuser(Goal) :-
	write(Goal),
        write('? Zadaj true, ak cieľ platí, inak false:'), nl,
	read(true).
Príklad inferencie
?- solve(zviera(punťo, tiger), Proof).
Proof = zviera(punťo, tiger) :-
          ((mäsožravec(punťo) :-
               (cicavec(punťo) :-
                   (má_srsť(punťo) :- true)
               ),
               (žerie_mäso(punťo) :- true)
          )
          (pruhy(punťo, čierne) :- true)
yes

Priame reťazenie

Meta-interpret
start :- goal(A), call(A), !, write(A).   %cieľ je odvodený
start :- A if B,           %výber pravidla
         conds(B),         %test podmienok
         not(A),           %dôsledok nie je v databáze
         assert(A),        %vloženie dôsledku do databázy
         start.            %hľadá ďalšie pravidlo

conds(C1 and C2) :- !, call(C1), conds(C2).
conds(C1 or C2)  :- call(C1).
conds(C1 or C2)  :- !, conds(C2).
conds(C)         :- call(C)
Báza znalostí Pravidlá v tvare Dosledok if Predpoklad a Predpoklady v tvare konjunkcie (and) alebo dizjunkcie (or).
V báze znalostí musí byť aspoň jeden fakt v tvare goal(A), kde A je hlava ľubovoľnej klauzuly (špecifikuje konečný cieľ).


3. Rozšírenie jazyka prolog


Last update by Mária Bieliková on