Прямой логический вывод

При обратном логическом выводе работа начинается с гипотез (например, о том, что утечка — в кухне) и происходит в обратном направлении согласно правилам в базе знаний, в целях получения легко подтверждаемых фактов (допустим, таких, что в гостиной вода). Но иногда более естественным способом является формирование рассуждений в противоположном направлении, от части "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, notfact С 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