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.
solve(true) :- !. solve((G1, G2)) :- solve(G1), solve(G2). solve(G) :- clause(G, B), solve(B).
Báza znalostí:- op(1200, xfx, if). solve((G1, G2)) :- !, solve(G1), solve(G2). solve(G) :- G if Body, !, solve(Body). solve(G) :- call(G).
%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).
Báza znalostí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, []).
Príklad inferencie%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).
?- 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) .......
Príklad inferenciesolve(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).
?- 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
Báza znalostí Pravidlá v tvare Dosledok if Predpoklad a Predpoklady v tvare konjunkcie (and) alebo dizjunkcie (or).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)