Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lb_IIsem / l2.doc
Скачиваний:
9
Добавлен:
05.03.2016
Размер:
136.19 Кб
Скачать

Лабораторна робота №2

Тема роботи:Продукційна модель представлення знань.

Мета роботи: Вивчення представлення знань засобами С++ та ПАСКАЛЬ в рамках продукційної моделі.

Теоретичні відомості

Однією з моделей представлення знань в системах баз знань (СБЗ) є продукційна модель. Продукційна модель грунтується на правилах і дозволяє представляти знання у вигляді речень “Якщоумова,тодія”, де умова (антицевд) - деяке речення-зразок, по якому здійснюється пошук в базі знань, а дія (консеквент) – дії, які здійснюються при успішному результаті пошуку. Такі дії можуть бути проміжними (виступати як умови для наступного пошуку), термінальними (припиняти подальший пошук) або цілевими (завершувати пошук).

Виведення в СБЗ, побудованих на основі продукційної моделі, буває прямий (від вхідних даних до шуканої цілі) або зворотній (від цілі доданих, які її підтверджують). Під даними тут розуміють факти, які зберігаються в базі фактів, і на основі яких працює машина виводу.

Продукційна модель характеризується наглядністю, простотою виводу, простотою внесення змін і високою модульністю СБЗ. На продукційній моделі грунтується більшість промислових СБЗ.

При побудові СБЗ на основі продукційної моделі основну увагу звертають на представлення фактів та правил. Факти бази знань описують те, що відомо про предметну область на даний момент часу. Факти являють собою класи або екземпляри класів з заданими їх властивостями , які відповілають стану області, про яку містяться знання в СБЗ. Правила встановлюють взаємозвязки між фактами. Правила являють собою перелік класів, властивостей та їх значень, пошук яких здійчнюється при перевірці істинності антицевда, та які встановлюються при виконанні консеквента. Система баз знань повинна забезпечувати можливість:

  1. Введення нових фактів та правил.

  2. Редагування існуючих фактів та правил.

  3. Видалення фактів та правил.

  4. Пошук заданих фактів та правил.

  5. Формування нових фактів на основі існуючмх з допомогою правил (Здійснюється при роботі машини виводу).

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

При побудові СБЗ мовами програмування ПАСКАЛЬ та С++ послідовно вирішують наступні задачі:

1. Проводять формалізацію опису знань (лабораторна робота №2).

2. Описують типи даних та змінні, які будуть використовуватися для представлення знань.

3. Розробляють підпрограми для маніпуляцій з знаннями.

4. Розробляють оболонку, яка обєднує базу знань, машину виводу та синтаксичний аналізатор.

Приклад.

В результаті формалізації опису знань отримано:

Класи – “многокутник” , “рівносторонній многокутник”, “правильний многокутник”, “трикутник”, “правильний трикутник”, “правильний трикутник”, “чотирикутник”, “трапеція”, “прямокутник”, “ромб”, “квадрат”.

Властивості– “є одним з”, “кількість кутів” (натуральні числа), “кількість сторін” (натуральні числа), “сторони перетинаються” = ні, “опуклий” = так, “кількість пар взаємнопаралельних сторін” (натуральні числа), “рівність кутів” (так/ні), “рівність сторін” (так/ні), “величина рівних кутів” (дійсні числа);

Співвідношення між класами:

“многокутник” має властивості – “кількість кутів” (натуральні числа >2), “кількість сторін” (натуральні числа >2), “сторони перетинаються” = “ні”, “опуклий” = “так”, “кількість пар взаємнопаралельних сторін” (натуральні числа), “рівність кутів” (так/ні), “рівність сторін” (так/ні). Всі інші класи є елементами класу “многокутник” або інших класів. Елементи класів по замовчуванню наслідують властивості класів та їх значення (якщо такі задані). Клас “правильний трикутник” додатково має властивість “величина рівних кутів” (дійсні числа).

При описі правил використаєм наступні позначення:

. (крапка) – властивість (X.Y – властивість Y поняття X);

= - має значення (X.Y=C – ВластивістьY класу X має значення C);

== - рівність;

 - слідує;

& - логічне І;

Перелік правил:

для довільного поняття X:

X.“кількість кутів”>2 & X.“кількість сторін”>2 & X.“сторони перетинаються”==“ні” & X.“опуклий”==“так”  X.“є одним з”=“многокутник”;

X.“є одним з”==“многокутник” &X.“рівність сторін”==так  X.“є одним з”=“рівносторонній многокутник”;

X.“є одним з”==“рівносторонній многокутник” & X.“рівність кутів”==“так”  X.“є одним з”=“правильний многокутник”;

X.“є одним з”==“правильний многокутник”  X.“величина рівних кутів”=180*(X. “кількість кутів” – 2)/X.“кількість кутів”;

X.“є одним з”==“многокутник” &X.“кількість сторін”==3  X.“є одним з”=“трикутник”;

X.“є одним з”==“трикутник” & X.“є одним з”==“правильний многокутник”  X.“є одним з”=“правильний трикутник”;

X.“є одним з”==“многокутник”& X.“кількість сторін”==4  X.“є одним з”=“чотирикутник”;

X.“є одним з”==“чотирикутник” & X.“кількість пар взаємнопаралельних сторін”==1  X.“є одним з”=“трапеція”;

X.“є одним з”==“чотирикутник” & X.“кількість пар взаємнопаралельних сторін”==2 & X.“рівність кутів”==“так”  X.“є одним з”=“прямокутник”;

X.“є одним з”==“чотирикутник” & X.“рівність сторін”==“так”  X.“є одним з”=“ромб”;

X.“є одним з”==“чотирикутник” & X.“є одним з”==“правильний многокутник”  X.“є одним з”=“квадрат”.

{Для для представлення знань використаєм наступні типи даних:}

type t_vl_vid=(vl,int,float,str);

str_t=string[15];

str_vl_t=string[31];

{Для представлення назви властивостей}

tp_vl_n=^t_vl_n;

t_vl_n=record

next:tp_vl_n;

nazva:str_vl_t;

vid:t_vl_vid;

end;

{Для представлення значень властивостей}

tp_zn=^t_zn;

t_zn=record

next_zn:tp_zn;

case vid:t_vl_vid of

int:(zn_i:longint);

float:(zn_f:double);

str:(zn_s:str_t);

vl:(zn_vl:tp_vl_n);

end;

{Для представлення класів}

tp_vl=^t_vl;

t_vl=record

next:tp_vl;

nazva:tp_vl_n;

zn:t_zn;

end;

tp_cl=^t_cl;

t_cl=record

next:tp_cl;

nazva:str_t;

vl:tp_vl;

end;

{Для представлення правил}

tp_ymova=^t_ymova;

t_ymova=record

next_and,next_or,pred:tp_ymova;

n_zm_l,n_zm_r,n_vidn,nul:byte;

vl_l,vl_r:tp_vl_n;

zn_l,zn_r:record

case vid:t_vl_vid of

int:(zn_i:longint);

float:(zn_f:double);

str:(zn_s:str_t);

vl:(zn_vl:tp_vl_n);

end;

end;

tp_dija=^t_dija;

t_dija=record

next:tp_dija;

n_zm_l,n_zm_r,n_vidn,nul:byte;

l,r:record

case vid:t_vl_vid of

int:(zn_i:longint);

float:(zn_f:double);

str:(zn_s:str_t);

vl:(zn_vl:tp_vl_n);

end;

end;

tp_pr=^t_pr;

t_pr=record

next:tp_pr;

antc:tp_ymova;

cnst:tp_dija;

end;

{Змінні, які є головами списків назв властивостей, класів та правил}

var vl_n:tp_vl_n;

cl:tp_cl;

pr:tp_pr;

{Функція пошуку імя властивості в списку}

function find_vl(vl_nazva:str_vl_t):tp_vl_n;

var p:tp_vl_n;

begin

p:=vl_n;

while (p<>nil) and (p^.nazva<>vl_nazva) do p:=p^.next;

find_vl:=p;

end;

{Для класів процедура пошуку аналогічна}

  

{Функція вставки імені властивості в список}

function ins_vl_n(vl_nazva:str_t):tp_vl_n;

var p:tp_vl_n;

begin

p:=find_vl(vl_nazva);

if p=nil then

begin new(p); fillchar(p,sizeof(t_vl_n),0); p^.nazva:=vl_nazva; end;

ins_vl_n:=p;

end;

{Для класів процедура пошуку аналогічна}

  

{Функція пошуку правила в списку}

function find_pr(new_pr:tp_pr):tp_pr;

var p:tp_pr;

ok:boolean;

{Функція порівняння антицевдів.

Реалізує порівняння двох дерев, вузлами яких є умови антицевдів, обєднані по І та АБО.}

function cmp_antc(x,y:tp_ymova):boolean;

var ok,ok_r,ok_l:boolean;

{Функція порівняння двох умов}

function cmp_ym(x,y:tp_ymova):boolean;

var ok,ok_r,ok_l:boolean;

begin

ok:=false; ok_r:=false; ok_l:=false;

if (x=y) then cmp_ym:=true

else

begin

with x^ do

begin

ok:=(n_zm_l=y^.n_zm_l) and (n_zm_r=y^.n_zm_r) and

(n_vidn=y^.n_vidn) and (vl_l=y^.vl_l) and (vl_r=y^.vl_r)

and (zn_l.vid=y^.zn_l.vid) and (zn_l.vid=y^.zn_l.vid);

if ok then

begin

case zn_l.vid of

int:if zn_l.zn_i=y^.zn_l.zn_i then ok_l:=true;

float:if zn_l.zn_s=y^.zn_l.zn_s then ok_l:=true;

str:if zn_l.zn_f=y^.zn_l.zn_f then ok_l:=true;

vl:if zn_l.zn_vl=y^.zn_l.zn_vl then ok_l:=true;

end;

if ok_l then

begin

case zn_r.vid of

int:if zn_r.zn_i=y^.zn_r.zn_i then ok_r:=true;

float:if zn_r.zn_s=y^.zn_r.zn_s then ok_r:=true;

str:if zn_r.zn_f=y^.zn_r.zn_f then ok_r:=true;

vl:if zn_r.zn_vl=y^.zn_r.zn_vl then ok_r:=true;

end;

end;

end;

end;

end;

cmp_ym:=ok and ok_l and ok_r;

end;

begin

with new_pr^do

begin

ok:=cmp_ym(antc,p^.antc);

if antc<>nil then

ok:=ok and cmp_antc(antc^.next_and,p^.antc^.next_and) and

cmp_antc(antc^.next_or,p^.antc^.next_or);

cmp_antc:=ok;

end;

end;

{Функція порівняння двох дій консеквента аналогічна до функції порівняння двох умов антицевдів}

function cmp_dija(x,y:tp_dija):boolean;

  

var x,y:tp_dija;

begin

p:=pr; ok:=false;

with new_pr^ do

begin

while (p<>nil) and not(ok) do

begin

x:=cnst; y:=p^.cnst;

repeat

ok:=cmp_dija(x,y); x:=x^.next; y:=y^.next;

until not(ok) or (x=nil) or (y=nil);

if (x=nil) or (y=nil) then ok:=ok and (x=y);

ok:=ok and cmp_antc(antc,p^.antc);

p:=p^.next;

end;

end;

if ok then find_pr:=p else find_pr:=nil;

end;

{Функції вставки правил та фактів аналогічні до функцій вставки умов та класів, але включають в себе взаємоперевірку і узгодження}

Завдання до лабораторної роботи.

Відповідно до даних варіанту, розробити ієрархію типів даних та набір підпрограм для їх обробки (поошуку та ваставки для властивості, класу, факту, правила ваставка) для представлення знань у СБЗ, реалізованій на ПАСКАЛІ або С++.

Соседние файлы в папке lb_IIsem