Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_Пролог_Етап2_3.doc
Скачиваний:
14
Добавлен:
14.11.2019
Размер:
1.46 Mб
Скачать

Експертна система фінансового планування.

Консультуюча експертна система, що прогнозує ситуацію на фондовій біржі.

Основними вхідними фактами (даними) є дані про стан на фондовій біржі.

Зразкові правила для експертної системи:

  1. Якщо процентні ставки падають, то рівень цін на біржі росте

  2. Якщо процентні ставки ростуть, то рівень цін на біржі падає.

  3. Якщо валютний курс долара падає, то процентні ставки ростуть.

  4. Якщо валютний курс долара росте, то процентні ставки падають.

  5. Якщо процентні ставки федерального резерву падають і гроші з федерального резерву додаються в банківську систему, то процентні ставки падають.

Особливості ЕС такі:

  • реалізований механізм прямого висновку;

  • інтерфейс користувача виконано з використанням VPI ( програма керується стандартними елементами управління – кнопки керування, елементи меню, діалогові вікна та ін.).

  • в інтерфейсі користувача застосована фразова форма діалогу з використанням морфологічного (лексичного) аналізу декларативним методом.

  • дані представлені у вигляді пар атрибут-значення.

  • база знань представляє собою набір продукцій (правил Якщо – То).

Узагальнений алгоритм роботи даної ЕС описується так:

  • отримання активних фактів в результаті діалогу;

  • запуск механізму прямого логічного висновку, спрацьовування відповідних продукцій і отримання висновків;

  • видавання результатів роботи ЕС.

/******************************************************************

Copyright (c) My Company

Project: STOCK

FileName: STOCK.PRO

Purpose: No description

Written by: Visual Prolog

Comments:

****************************************************************/

include "stock.inc"

include "stock.con"

include "hlptopic.con"

%BEGIN_WIN Task Window

/*************************************************************

Event handling for Task Window

*************************************************************/

predicates

task_win_eh : EHANDLER

constants

%BEGIN Task Window, CreateParms, 18:52:45-25.8.2005, Code automatically updated!

task_win_Flags = [wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_ClipSiblings]

task_win_Menu = res_menu(idr_task_menu)

task_win_Title = "Stock"

task_win_Help = idh_contents

%END Task Window, CreateParms

/* Початок бази знань та механізму логічного висновку ЕС */

/***********************************************************/

constants

questions = 5 % кількість питань плюс один

domains

ref_string = reference string

list=integer* % список цiлих чисел

Database - data

q(string,string) quit(integer) % для допомiжних цiлей

% факти iнтерфейсного модуля

synonym(string синонім, string значення) %предикат для збереження синонімів слів,

%які визначають значення атрибутів

% предикати для формування активних фактiв

fact(string атрибут,string значення) %факти збереження пар атрибут-значення

buf(integer,string) % буфер видiлених слiв або фраз

predicates

start

w(integer,string) input(integer) % для обробки запитальника

%для обробки рядкiв:

nondeterm str_proc(integer,string)

nondeterm formact(integer) asform(integer,string) % для формування активних фактiв

nondeterm job % виклик механiзму висновку

nondeterm rule(ref_string атрибут,ref_string значення) % предикат для продукцій та

%органiзацiї механiзму висновку

nondeterm output % видача висновку

clauses

/*База знань ЕС

Основні правила прямого логічного висновку - продукції:*/

rule("stock","зростає"):-fact("interest","падає").

rule("stock","падає"):-fact("interest","зростає").

rule("interest","зростає"):-fact("dollar","падає").

rule("interest","падає"):-fact("dollar","зростає").

rule("interest","падає"):-fact("fedint","падає"),fact("fedmon","додаються").

/*Кінець бази знань ЕС*/

start:- retractall(buf(_,_)),retractall(fact(_,_)),

input(1), % опитування i формування вхiдних фактiв

formact(1), % формування активних фактiв

job, % виклик механiзму висновку

output,!. % висновок результатiв роботи

/* *************************************************************

*************** iнтерфейс iз користувачем *********************

*********** морфологiчний (лексичний) аналiз декларативним методом ******/

% Цикл опитування i формування активних фактiв

input(N):- not(w(N,_)),!.

input(N):-w(N,W),

Msg=W,

InitStr="",

Title="Дайте відповідь на питання",

_NewSTRING=dlg_GetStr(Title,Msg,InitStr),

upper_lower(_NewSTRING,S),

str_proc(N,S),

N1=N+1, input(N1),!.

% формуємо базу фактiв видiлених слiв чи фраз

str_proc(N,S):- assert(buf(N,S)).

str_proc(_,_).

% Запитальник

w(1,"Як змінюється процентна ставка (Зростає, падає, Вам невідомо) ?").

w(2,"Як змінюється курс долара (Зростає, падає, Вам невідомо) ?").

w(3,"Як змінюється процентна ставка федерального резерву(Зростає, падає, Вам невідомо) ?").

w(4,"Додаються чи видаляються із банківської системи гроші із федерального резерву, або Вам невідомо ?").

/* *************************************************************

*************** Формування активних фактiв *****************

***************************************************************/

formact(constants):- !.

formact(N):- buf(N, B), synonym(Syn,W),searchstring(B,Syn,_),

asform(N,W),N1=N+1,formact(N1).

formact(N):- N1=N+1,formact(N1).

synonym("падає","падає").

synonym("впала","падає").

synonym("впав","падає").

synonym("вниз","падає").

synonym("зростає","зростає").

synonym("зріс","зростає").

synonym("зросла","зростає").

synonym("вгору","зростає").

synonym("додаються","додаються").

synonym("додалися","додаються").

synonym("додавалися","додаються").

% одержуємо активнi факти для рiзних груп

asform(1,A):-assert(fact("interest",A)).

asform(2,A):-assert(fact("dollar",A)).

asform(3,A):-assert(fact("fedint",A)).

asform(4,A):-assert(fact("fedmon",A)).

% Запуск механізму прямого логічного висновку

job:-rule(X, Y), not(fact(X,Y)),assert(fact(X,Y)),rule(_, _).

job.

% Видача сформованих висновкiв

output:-

fact("stock",X),

fact("interest",Y),

Title="Висновки системи: ", concat("Ціни на фондовій біржі ", X, String1),

dlg_Note(Title,String1),concat("Процентні ставки ", Y, String2),

dlg_Note(Title,String2).

output:-

Title="Висновки системи: ",dlg_Note(Title,"Вибачте, відповіді немає").

/********************************************************************/

/*Далі іде код, сформований автоматично системою програмування Visual Prolog*/

clauses

%BEGIN Task Window, e_Create

task_win_eh(_Win,e_Create(_),0):-!,

%BEGIN Task Window, InitControls, 18:52:45-25.8.2005, Code automatically updated!

%END Task Window, InitControls

%BEGIN Task Window, ToolbarCreate, 18:52:45-25.8.2005, Code automatically updated!

tb_project_toolbar_Create(_Win),

tb_help_line_Create(_Win),

%END Task Window, ToolbarCreate

ifdef use_message

msg_Create(100),

enddef

!.

%END Task Window, e_Create

%MARK Task Window, new events

%BEGIN Task Window, id_consult

task_win_eh(_Win,e_Menu(id_consult,_ShiftCtlAlt),0):-!,

start, %при виборі пункта меню Consult починається робота ЕС

!.

%END Task Window, id_consult

%BEGIN Task Window, id_help_contents

task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,

vpi_ShowHelp("stock.hlp"),

!.

%END Task Window, id_help_contents

%BEGIN Task Window, id_help_about

task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,

dlg_about_dialog_Create(Win),

!.

%END Task Window, id_help_about

%BEGIN Task Window, id_file_exit

task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,

win_Destroy(Win),

!.

%END Task Window, id_file_exit

%BEGIN Task Window, e_Size

task_win_eh(_Win,e_Size(_Width,_Height),0):-!,

ifdef use_tbar

toolbar_Resize(_Win),

enddef

ifdef use_message

msg_Resize(_Win),

enddef

!.

%END Task Window, e_Size

%END_WIN Task Window

/********************************************************************

Invoking on-line Help

*******************************************************************/

project_ShowHelpContext(HelpTopic):-

vpi_ShowHelpContext("stock.hlp",HelpTopic).

/********************************************************************

Main Goal

********************************************************************/

goal

ifdef use_mdi

vpi_SetAttrVal(attr_win_mdi,b_true),

enddef

ifdef ws_win

ifdef use_3dctrl

vpi_SetAttrVal(attr_win_3dcontrols,b_true),

enddef

enddef

vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"stock",task_win_Title).

%BEGIN_TLB Project toolbar, 18:52:45-25.8.2005, Code automatically updated!

/********************************************************************

Creation of toolbar: Project toolbar

********************************************************************/

clauses

tb_project_toolbar_Create(_Parent):-

ifdef use_tbar

toolbar_create(tb_top,0xC0C0C0,_Parent,

[tb_ctrl(id_file_new,pushb,idb_new_up,idb_new_dn,idb_new_up,"New;New file",1,1),

tb_ctrl(id_file_open,pushb,idb_open_up,idb_open_dn,idb_open_up,"Open;Open file",1,1),

tb_ctrl(id_file_save,pushb,idb_save_up,idb_save_dn,idb_save_up,"Save;File save",1,1),

separator,

tb_ctrl(id_edit_undo,pushb,idb_undo_up,idb_undo_dn,idb_undo_up,"Undo;Undo",1,1),

tb_ctrl(id_edit_redo,pushb,idb_redo_up,idb_redo_dn,idb_redo_up,"Redo;Redo",1,1),

separator,

tb_ctrl(id_edit_cut,pushb,idb_cut_up,idb_cut_dn,idb_cut_up,"Cut;Cut to clipboard",1,1),

tb_ctrl(id_edit_copy,pushb,idb_copy_up,idb_copy_dn,idb_copy_up,"Copy;Copy to clipboard",1,1),

tb_ctrl(id_edit_paste,pushb,idb_paste_up,idb_paste_dn,idb_paste_up,"Paste;Paste from clipboard",1,1),

separator,

separator,

tb_ctrl(id_help_contents,pushb,idb_help_up,idb_help_down,idb_help_up,"Help;Help",1,1)]),

enddef

true.

%END_TLB Project toolbar

%BEGIN_TLB Help line, 18:52:45-25.8.2005, Code automatically updated!

/********************************************************************

Creation of toolbar: Help line

********************************************************************/

clauses

tb_help_line_Create(_Parent):-

ifdef use_tbar

toolbar_create(tb_bottom,0xC0C0C0,_Parent,

[tb_text(idt_help_line,tb_context,452,0,4,10,0x0,"")]),

enddef

true.

%END_TLB Help line

%BEGIN_DLG About dialog

/********************************************************************

Creation and event handling for dialog: About dialog

********************************************************************/

constants

%BEGIN About dialog, CreateParms, 18:52:45-25.8.2005, Code automatically updated!

dlg_about_dialog_ResID = idd_dlg_about

dlg_about_dialog_DlgType = wd_Modal

dlg_about_dialog_Help = idh_contents

%END About dialog, CreateParms

predicates

dlg_about_dialog_eh : EHANDLER

clauses

dlg_about_dialog_Create(Parent):-

win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID,dlg_about_dialog_eh,0).

%BEGIN About dialog, idc_ok _CtlInfo

dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,

win_Destroy(_Win),

!.

%END About dialog, idc_ok _CtlInfo

%MARK About dialog, new events

dlg_about_dialog_eh(_,_,_):-!,fail.

%END_DLG About dialog