При обратном логическом выводе работа начинается с гипотез (например, о том, что утечка — в кухне) и происходит в обратном направлении согласно правилам в базе знаний, в целях получения легко подтверждаемых фактов (допустим, таких, что в гостиной вода). Но иногда более естественным способом является формирование рассуждений в противоположном направлении, от части "if к части "then". Прямой логический вывод начинается не с гипотез, а с некоторых подтвержденных фактов. Обнаружив, что в гостиной вода, а в ванной сухо, можно сделать вывод, что неисправность в кухне; кроме того, заметив, что окно кухни закрыто, можно сделать
Глава 15. Представление знаний и экспертные системы
заключение, что вода не поступает снаружи; это ведет к окончательному выводу, что утечка в кухне.
Реализации в программе Prolog простой процедуры прямого логического вывода все еще остается простой, хотя и не столь тривиальной, как и реализация процедуры обратного логического вывода. В листинге 15.5 показан интерпретатор прямого логического вывода, в котором предполагается, что правила, как и прежде, представлены в следующей форме: if condition then Conclusion
В качестве условия (Condition) здесь может быть задано любое выражение AND/OR. Для простоты во всей данной главе предполагается, что правила не содержат переменных. Интерпретатор начинает свою работу с того, что известно (задано в отношении fact), выводит все заключения (Conclusion), которые следуют из этого отношения, и добавляет (с помощью предиката assert) эти заключения к отношению fact. Поэтому база знаний, рассматриваемая в качестве примера, обрабатывается этим интерпретатором следующим образом:
?- forward.
Derived: probl«_i»jciteh«i Derived: no_Water_from_outside Derived: ieak_in_kitchen No more facts
Листинг 15.5. Интерпретатор правил прямого логического вывода
I Простой интерпретатор прямого логического вывода на языке Prolog
forward:- new_derived_fact{ P), !, |
write С 'No mote facts'). |
write! 'Derived: '), write (P), nl, assert (fact(P)), forward |
I Новый факт
I Продолжить работу
Процесс порождения правил завершен
new_derived_f act [ Concl)
if Cond then Concl, not fact С Concl), compcsed_fact(Cond).
-
<k Некоторое правило % Заключение правила
I Условие истинно?
еще не факт
composed_fact(Cond)
fact(Cond).
-
простой факт
composed_fact Condi and Cond2) composed _fact [ Condi), composed_fact (Cond2).
-
* Оба конъюнкта истинны
compOsed_faCt Condi or Cond2) composed_fact[ Condi )
: -
compcsed_fact [ Cond2