Пользовательские консультации

Рассматриваемая система по-разному использует статическую и динамическую информацию. Определение фрейма, его процедурные элементы и эвристики составляют статическую информацию системы. Они остаются неизменными от одного до другого выполнения программы. Очевидно, каждый раз запуская программу, пользователь заполняет копию образца фрейма. Это составляет динамическую информацию системы.

Фрейм-ориентированные системы различают прототип фрейма и его экземпляр. Все экземпляры имеют одинаковое число и тип слотов. Все процедурные связи и эвристики применяются ко всем экземплярам. Очевидно, каждый экземпляр содержит разные значения слотов.

Когда экземпляр вызывается впервые, система должна возвращать копию fa_frame из базы:

fa_frame([Interest,Revenues,Expenses,Risk,Term,Investment])

Когда фрейм загружен, система задает вопросы, ассоциированные со слотами investment, revenues, risk, expenses и проверяет ответ пользователя на допустимость значений для этих слотов. Эти шаги являются частью рекурсивного цикла (bind_all), выполняемого над списком слотов, которые требуют ввода пользователем информации.

bind_all([],_).

bind_all([S:V|Slots],I):-

first_unbound_slot([S:V|Slots]),

user_choose_value([S:V|Slots]),

Bind_all(Slots,Index).

Предикат first_unbound_slot рекурсивно ищет список для тех элементов, которые еще не заполнены. Предикат успешен, если аргумент Val является переменной, иначе пропускает конкретизированные переменные и проверяет, является ли следующий аргумент переменной.

first_unbound_slot([Slot:Val|Slots]):-

var(Val),!.

first_unbound_slot([_|Slots]):-

First_unbound_slot(Slots).

Когда будет найден несвязанный элемент, предикат bind_all ia?aaaco nienie i?aaeeaoo user_choose_value. Этот предикат задает вопрос, ассоциированный с несвязанным слотом, и вызывает предикат get_ans, чтобы заполнить слот ответом пользователя.

user_choose_value([Slot:Val|Slots]):-

Question(Slot,Q),

Write(Q),

get_ans(Slot,Val,Q),!.

Предикат get_ans считывает ответ пользователя и проверяет его значимость. Если ответ незначим, get_ans выводит сообщение, содержащее допустимые значения для слота. Поэтому запрос будет повторен для нового ввода ответа пользователем.

Get_ans(Slot, Ans, Q):-

read(Ans),%get_ans(Ans),

valdef(Slot,_,Ans).%,!.

Get_ans(Slot, Ans, Q):-

Write('Допустимое значение слота':Slot),nl,

Get_ans_aux(Slot,Q),

Get_ans(Slot,Ans,Q).

Get_ans_aux(Slot,Q):-

Valdef(Slot,Prompt,Def),

Tab(4),write(Prompt:Def),nl,fail.

Get_ans_aux(Slot,Q):-

Nl,write(Q).

Сокращение пространства решений

В некоторых относительно несложных проблемах возникает необходимость сокращения пространства решений. Поскольку число переменных и число допустимых значений, которые эти переменные могут принимать возрастает, число возможных комбинаций растет настолько быстро, что вскоре мы имеем неуправляемое пространство решений. Этот феномен известен как «комбинаторный взрыв». Этот рост нелинеен. Все возможные значения всех переменных комбинируют. В рассматриваемом примере мы имеем три возможных значения для interest, expenses, term и revenues, четыре для risk и investment. Размер пространства решений принимает значение

3´3´3´3´4´4=1296.

Из этих 1296 комбинаций лишь 108 значимы. Для логического вывода удаляются все лишние правила. Таким образом 108 возможных решений могут быль выведены только семнадцатью правилами. Они определяют допустимые комбинации значений, которые фрейм может содержать. Получение решения, таким образом, требует только ту текущую конкретизацию фрейма, которая соответствует одному из определенных в правиле образцов фрейма.

Выбор текущего правила процессором логического вывода осуществляется в соответствии с обратным либо прямым методом вывода. Применение правил к экземпляру фрейма связано с унификацией. Поскольку правило может определить список значений слота, и какое-то одно значение является значимым, то процессор логического вывода не может полностью полагаться на схему унификации Prolog’а. Он активизирует предикат unify для проверки принадлежности значения слота списку значений в правиле.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: