bazyZnanii2003 (Лабораторные работы по Прологу (задания уточнять у преподавателя)), страница 3
Описание файла
Файл "bazyZnanii2003" внутри архива находится в папке "Лабораторные работы по Прологу (задания уточнять у преподавателя)". Документ из архива "Лабораторные работы по Прологу (задания уточнять у преподавателя)", который расположен в категории "". Всё это находится в предмете "системы искусственного интеллекта" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "системы искусственного интеллекта" в общих файлах.
Онлайн просмотр документа "bazyZnanii2003"
Текст 3 страницы из документа "bazyZnanii2003"
В Prolog’е фрейм может быть определен как структура, содержащая список слотов. Каждый слот имеет имя и значение, разделенные двоеточием. Обращаются к паре Name:Value как единому аргументу, но разные части аргумента могут быть доступны по необходимости.
fa_frame([interest:Interest,
revenues:Revenues,
expenses:Expenses,
risk:Risk,
term:Term,
investment:Investment]).
(Имя предиката fa_frame образовано из начальных букв finansial advisor.)
Фреймы могут хранить не только фактографическую информацию, как fa_frame, но и информацию о внутренних процедурах–демонах. Демоны могут, например, формулировать вопрос или определять список допустимых значений, которые возможны в слоте. Система использует эту дополнительную информацию, чтобы задать соответствующий вопрос об обновлении информации в слоте или проверке необходимости передачи пользователем информации в конкретный слот. Одна из процедурных связей позволяет задать вопрос в момент ожидания нового значения для слота. Например, когда системе необходимо заполнить значением слот interest, будет задан вопрос: «Какова ожидаемая ставка прибыли в следующем году?» При вводе ответа система проверит на допустимость введенных значений из заданного списка (+, -, unchanged).
Следующие структуры valdef содержат продукционную связь определения допустимых значений для конкретного слота. Например, определение expenses устанавливает два состоятельных значения для этого слота. Знак плюс означает, что расходы превысят бюджет на 10%; знак минус – расходы не превысят бюджет на 10%.
valdef(expenses, 'Exceed budget (by more than 10%)',+).
valdef(expenses, 'Ниже уровня бюджета на 10%',–).
valdef(expenses, 'Не изменится', =).
valdef(revenues, 'Превысят ожидания (более 10%)', +).
valdef(revenues, 'Небольшое снижение (более 10%)', –).
valdef(revenues, 'Ia eciaiyony', =).
valdef(interest, 'Рanoao',up).
valdef(interest, 'Не изменится',unchanged).
valdef(interest, 'Снизится',down).
valdef(risk,'Низкий',low).
valdef(risk,'средне-низкий',medium-low).
valdef(risk,'средне-высокий',medium-high).
valdef(risk,'высокий',high).
valdef(investment,'Правительственные', gov).
valdef(investment, 'Банков свободной зоны или евродоллары',offshore).
valdef(investment,'Беспроцентные залоговые ценные бумаги',unrated).
valdef(investment,'Облигации банков или корпораций',obligs).
valdef(term,'Короткий (1–3 мес)',short).
valdef(term,'Nредний (3–6 мес)',medium).
valdef(term,'Aeeiiue (6–12 мес)',long).
Структура question содержит вопросы, которые ассоциированы с каждым слотом в фрейме.
question(interest,'Какую ставку дохода ожидаете в следующем году?').
question(expenses,'Насколько могут реальные расходы отличаться (отклоняться) от ожидаемых?').
question(revenues,'Насколько могут отличаться (отклоняться) реальные доходы от ожидаемых?')
question(interest,'Каков допустимый риск?').
Сроки капитальных вложений (investment) определяются из значений interest, revenues и expenses. Каждое из следующих правил определяет сроки вложений, которые соответствуют конкретной комбинации вклада, годового дохода и расходов. Правила записаны для фреймов, которые в целом их содержат. Например, рекомендуемый срок вклада – short, если interest down (низкий), если revenue (годовой доход) «–» (минус) и expenses (расходы) “+” или “=”.
rule(term:short, [interest:[down], revenues:[–], expenses:[+,=]]).
rule(term:medium, [interest:[down], revenues:[–], expenses:[–]]).
rule(term:medium, [interest:[down], revenues:[=], expenses:[+]]).
rule(term:long, [interest:[down], revenues:[=], expenses:[–,=]]).
rule(term:long, [interest:[down], revenues:[+], expenses:[+,=,–]]).
rule(term:short, [interest:[up], revenues:[+,=,–], expenses:[+,=,–]]).
rule(term:medium, [interest:[unchanged], revenues:[=], expenses:[=,–]]).
rule(term:short, [interest:[unchanged], revenues:[=], expenses:[+]]).
rule(term:long, [interest:[unchanged], revenues:[+], expenses:[=,–]]).
rule(term:medium, [interest:[unchanged], revenues:[+], expenses:[+]]).
Слот investment определяется значениями слотов risk и term. Таким образом, если risk – low и term – medium or long, то рекомендуемое вложение –gov. Это правило имеет вид:
rule(investment: gov, [risk:[low], term:[medium,long]]).
rule(investment:obligs, [risk:[low], term:[short]]).
rule(investment:obligs, [risk:[low-medium],term:[medium,long]]).
rule(investment:offshore, [risk:[low-medium],term:[short]]).
rule(investment:offshore, [risk:[medium-high],term:[short,medium,long]]).
rule(investment:unrated, [risk:[high],term:[short,medium,long]]).
В системе fa_frame определяется текущее множество условий, которые должны анализироваться.
Структуры valdef и question определяют связанные процедуры для фрейма. Наконец, правила для определения рекомендуемых вложений также представляются фреймами.
Пользовательские консультации
Рассматриваемая система по-разному использует статическую и динамическую информацию. Определение фрейма, его процедурные элементы и эвристики составляют статическую информацию системы. Они остаются неизменными от одного до другого выполнения программы. Очевидно, каждый раз запуская программу, пользователь заполняет копию образца фрейма. Это составляет динамическую информацию системы.
Фрейм-ориентированные системы различают прототип фрейма и его экземпляр. Все экземпляры имеют одинаковое число и тип слотов. Все процедурные связи и эвристики применяются ко всем экземплярам. Очевидно, каждый экземпляр содержит разные значения слотов.
Когда экземпляр вызывается впервые, система должна возвращать копию 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],I,Index),
user_choose_value([S:V|Slots],Index),
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,wtite(Q).
Сокращение пространства решений
В некоторых относительно несложных проблемах возникает необходимость сокращения пространства решений. Поскольку число переменных и число допустимых значений, которые эти переменные могут принимать возрастает, число возможных комбинаций растет настолько быстро, что вскоре мы имеем неуправляемое пространство решений. Этот феномен известен как «комбинаторный взрыв». Этот рост нелинеен. Все возможные значения всех переменных комбинируют. В рассматриваемом примере мы имеем три возможных значения для interest, expenses, term и revenues, четыре для risk и investment. Размер пространства решений принимает значение
333344=1296.
Из этих 1296 комбинаций лишь 108 значимы. Для логического вывода удаляются все лишние правила. Таким образом 108 возможных решений могут быль выведены только семнадцатью правилами. Они определяют допустимые комбинации значений, которые фрейм может содержать. Получение решения, таким образом, требует только ту текущую конкретизацию фрейма, которая соответствует одному из определенных в правиле образцов фрейма.
Выбор текущего правила процессором логического вывода осуществляется в соответствии с обратным либо прямым методом вывода. Применение правил к экземпляру фрейма связано с унификацией. Поскольку правило может определить список значений слота, и какое-то одно значение является значимым, то процессор логического вывода не может полностью полагаться на схему унификации Prolog’а. Он активизирует предикат unify для проверки принадлежности значения слота списку значений в правиле.
apply_rules(Trole:Tval, Froles):-
rule(Trole:Tval,Frole_list),
unify(Froles,Frole_list).
unify([],[]).
unify([H:Val|T],[H1:Val1|T1]):-
member(Val,Val1),
unify(T,T1).
Система в начале применяет правила для определения значения term. Затем использует правила для определения investment. Это достигается добавлением двух подцелей apply_rules в запускающем предикате fa:
fa:-
fa_frame([Interest,Revenues,Expenses,Risk,Term,Investment]),
bind_all([Interest,Revenues,Expenses,Risk],1),
apply_rules(Term,[Interest,Revenues,Expenses]),
apply_rules(Investment,[Risk,Term]).
Объяснения результатов консультаций
Естественным желанием пользователя является получение объяснения по выведенному системой ответу. Часто упростить объяснение гораздо сложнее, чем просто описать систему. Например, в большинстве систем в процессе извлечения информации можно задать вопрос «Почему?» Система в этом случае представляет объяснение достижения цели, которую она пыталась вывести по текущему запросу. Когда ответ найден, пользователь может задать вопрос «Как?» Система просматривает рассуждения в обратном направлении, через цепочку целей, которые были выведены в порядке их появления в решении. Очевидно, построение более простого понятного объяснения не намного сложнее, чем описать систему. Иными совами, текст объяснения фрагментируется таким образом, что при соответствующем соединении фрагментов был получен осмысленный вывод системы.
Текст объяснения является некоторой процедурной связью в слоте. Если части текста объяснения построены аккуратно, в совокупности они должны соответствовать состоянию системы.
explain(interest:down, 'Поскольку вы ожидаете снижение ставки прибыли, то было бы естественным сделать долговременные инвестиции, чтобы сохранить высокую текущую прибыль').
explain(interest:up,'Поскольку вы ожидаете повышение ставки прибыли, было бы естественным сделать короткие инвестиции, что позволит вам позднее реинвестировать высокие прибыли').
explain(interest:unchanged,'Поскольку вы ожидаете неизменной ставку прибыли, окажутся неизменными и сроки выплаты ваших инвестиций').
explain(revenues: –,'Так как годовой доход может быть меньше ожидаемого').
explain(revenues: +,'Так как годовой доход должен быть больше ожидаемого').
explain(revenues:=,'Отклонение годового дохода от бюджета маловероятно').
explain(expenses: –,'и расходы могут быть ниже ожидаемых').
explain(expenses: +,'и расходы должны быть выше ожидаемых').
explain(expenses: =,'и расходы вряд ли сильно отклонятся от бюджета').
explain(term: short,'целесообразны краткосрочные инвестиции. Поскольку рекомендованный срок короткий').
explain(term:medium,'действуйте осторожно и инвестируйте на средний срок. Так как рекомендуемый срок средний').
explain(term:long,'долгосрочные инвестиции наиболее целесообразны. Так ка рекомендуемый срок длинный').
explain(risk:low,'и вы предпочитаете небольшой риск, и хорошим инвестиционным средством для вас').
explain(risk:low–medium,'и вы предпочитаете риск от низкого до среднего, и хорошим инвестиционным средством для вас').
explain(risk:medium–high,'и вы предпочитаете риск от среднего до высокого, хорошим инвестиционным средством для вас').
explain(risk:high,'и вы предпочитаете высокий риск, и хорошим инвестиционным средством для вас').
explain(investment:usgov,'являются (фактически без риска) правительственные инвестиции').
explain(investment:obligs,'является невысокий риск по облигациям крупных банков и корпораций').