Декларативна мова програмування "Пролог"

Галузі застосування та принцип роботи мови програмування "Пролог". Керування процесом пошуку рішень, типи даних та використання списків. Рекурсивні процедури та цикли за допомогою пошуку з поверненням. Виконання арифметичних та логічних операцій.

Рубрика Программирование, компьютеры и кибернетика
Вид курс лекций
Язык украинский
Дата добавления 06.07.2011
Размер файла 99,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

пог_рахунок1(НовеN),nl.

Стан процедури доводиться зберігати тому, що викликаюча процедура не виконала останньої підцілі (nl). Якщо під час рекурсивного виклику робляться спроби знаходження альтернативних рішень, стан процедури зберігається для того, що при невдалому рекурсивному виклику повернутися і спробувати знайти альтернативне рішення.

2. У наступному прикладі хоч рекурсивний виклик і є останнім викликом у виразі але хвостової рекурсії не має тому, що існує альтернатива виразу, який має рекурсивний виклик. Тому стан процедури доводиться зберігати, щоб після обробки рекурсивного виклику розглянути інші альтернативи.

predicates

пог_рахунок2(real)

clauses

пог_рахунок2(N):-write(N),nl,

НовеN=N+1,

пог_рахунок2(НовеN).

пог_рахунок2(N):-N<0,

write(“N-негативне”).

Якщо перший та другий вирази пог_рахунок2 поміняти місцями то на момент рекурсивного виклику всі альтенативи будуть розглянуті і рекурсія буде хвостовою.

3. Альтернативним варіантом не обов'язково повинен бути вираз, який відповідає самій рекурсивній процедурі, це цілком може бути альтернативний варіант іншого виразу, що знаходиться перед рекурсивним викликом.

predicates

пог_рахунок3(real)

clauses

пог_рахунок3(N):-write(N),nl,

НовеN=N+1,

перевірити(НовеN),[!,]

пог_рахунок3(НовеN).

пог_рахунок3(N):-N<0,

write(“N-негативне”).

перевірити(Z):=Z>=0.

перевірити(Z):-Z<0.

Припустимо, що N - позитивне при виклику пог_рахунок3. Перший вираз перевірити задовільнюється, але в момент рекурсивного виклику перевірка другого виразу перевірити не зроблена. Тому робочий стан рекурсивної процедури зберігається для того, щоб після повернення розглянути цю альтернативу.

Якщо після підцілі перевірити поставити відсікання, то вираз перевірити стане детермінованим (не буде давати альтернатив) і рекурсія стане хвостовою.

Тема 7. Списки

Список - це об'єкт, який містить в середині себе довільну кількість інших аналогічних об'єктів.

Списки Пролога нагадують масиви в інших мовах програмування, але на відміну від масива списки не мають певного розміру, вказаного до його використання. Список, що включає 1, 2 та 3 записується у вигляді [1,2,3]. Кожна одиниця, що входить в список називається елементом. Для формування списку елементи розділяються комами і беруться в квадратні дужки. Список є рекурсивним складовим обєктом. Він складається з двох частин: голови, що представляє перший елемент і хвоста, що являє собою список, що складається з усіх інших елементів.

Хвіст списку - це список, голова списку - це завжди елемент (крім складових списків).

1 - голова, [2,3] - хвіст.

У випадку одноелементного списку наприклад [а], голова - це „а”, хвіст - [ ].

Списки мають наступну структуру:

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Одноелементний список [а] - це не одне й те саме, що елемент а, який міститься в ньому.

Приклад.

список

голова

хвіст

[a,b,c]

„а”

[bc]

[a]

„а”

[ ]

[ ]

-

-

[[1,2,3],[2,3,4],[ ]]

[1,2,3]

[[2,3,4],[ ]]

Оголошення списків.

Щоб оголосити домен для списку цілих значень використовують наступне оголошення:

domains

список=integer*

Зірочка вказує на те, що це список.

Елементами списку можуть бути будь-які об'єкти, включаючи інші списки. Однак всі елементи списку повинні належати до одного й того ж домену.

domains

список_списків=список*

список=integer*

Уніфікація списків.

В Пролозі передбачена можливість явного задання голови і хвоста списку. Замість коми голову і хвіст можно розділити за допомогою символу „|”.

Приклад.

список[а,b,с] [a|[b,c]] [a|[b|[c|[ ] ] ] ].

программування мова пролог

Таблиця уніфікації списків.

список1

список2

зв'язування зміних

[X,Y,Z]

[Ганна, їсть, торт]

X=Ганна, Y=їсть, Z=торт

[7]

[X|Y]

X=7, Y=[ ]

[1,2,3,4]

[X,Y|Z]

X=1, Y=2, Z=[3,4]

[1,2]

[3|X]

13 не можна уніфікувати

Використання списків.

У зв'язку з тим, що списки є рекурсивними складовими структурами даних, то для їх обробки необхідні рекурсивні алгоритми. Найбільш загальним способом обробки списків є проходження по списку до кінця з виконанням над кожним елементом яких-небудь дій. Для такого алгоритму необхідні два вирази: перший вказує на те, що робити зі звичайним списком (який можна розбити на голову і хвіст), другий вказує на дії для порожнього списку.

Задача 1. Виведення списків.

ch08ex01.pro

domains

список=integer*

predicates

вивести_список(список)

clauses

вивести_список([ ]).

вивести_список([Г|Х]):-write(Г),nl,

вивести_список(X).

goal

вивести_список([1,2,3]).

Виклик

Г

Х

вивести_список([1,2,3])

1

[2,3]

вивести_список([2,3])

2

[3]

вивести_список([3])

3

[ ]

вивести_список([ ])

-

-

Задача 2. Підрахунок елементів списку.

Для цієї програми необхідно ввести відношення довжина. Довжина порожнього списку дорівнює нулю. Довжина будь-якого іншого списку дорівнює одиниця плюс довжина його хвоста.

ch08ex02.pro

domains

список=integer*

predicates

довжина(список,integer)

clauses

довжина([ ],0).

довжина([_,|X],L):-довжина(X,ДовжинаХвоста),

L=ДовжинаХвоста+1.

goal

довжина([1,2,3],X).

Виклик

X

L

ДовжинаХвоста

довжина([1,2,3])

[2,3]

3

2

довжина([2,3])

[3]

2

1

довжина([3])

[ ]

1

-

довжина([ ])

-

0

-

Задача 3. До кожного елемента списка додати 1.

Щоб додати 1 до порожнього списку треба згенерувати інший порожній список. Щоб додати 1 до елементів будь-якого іншого списку, треба додати 1 до його голови і зробити її головою результату, а потім додати 1 до хвоста і зробити його хвостом результату.

ch08ex04.pro

domains

список=integer*

predicates

додати1(список,список)

clauses

додати1([ ],[ ]).

додати1([Г|X],[Г1|X1]):-Г1=Г+1,

додати1(X,X1).

goal

додати1([1,2,3],Нов_список).

Виклик

Г

Х

Г1

Х1

Нов_список

додати1([1,2,3,4])

1

[2,3,4]

2

[3,4,5]

2,3,4,5

додати1([2,3,4])

2

[3,4]

3

[4,5]

додати1([3,4])

3

[4]

4

[5]

додати1([4])

4

[ ]

5

[ ]

додати1([ ])

[ ]

Задача 4. Вилучити зі списку негативні числа.

ch08ex05.pro

domains

список=integer*

predicates

відкинути(список,список)

clauses

відкинути([ ],[ ]).

відкинути([Г|Х],ОбробленийХвіст):-

Г<0,!,

відкинути(Х,ОбробленийХвіст).

відкинути([Г|Х],[Г|ОбробленийХвіст):-

відкинути(Х,ОбробленийХвіст).

goal

відкинути([2,-45,3,468],Y)

Виклик

Г

Х

ОбробленийХвіст

Y

відкинути([2,-45,3,46])

2

[-45,3,46]

[2,3,46]

[2,3,46]

відкинути([-45, 3, 46])

-45

[3,46]

[3, 46]

-

відкинути([3,46])

3

[46]

[3,46]

-

відкинути([46])

46

[ ]

[46]

-

відкинути([ ])

-

-

[ ]

-

Задача 5. Визначити приналежність елементу до списку.

ch08ex06.pro

domains

список=integer*

predicates

член_списку(symbol,список)

clauses

член_списку(Ім'я,[Ім'я|_]).

член_списку(Ім'я,[_|X]):-член_списку(Ім'я,X).

Перший вираз член_списку досліджує голову списку, якщо голова - це Ім'я, яке ми шукамо, то Ім'я - член списку

Якщо голова списку не Ім'я, то ми переходимо до другого виразу в якому перевіряється чи є елемент Ім'я в хвості списку. На звичайній мові це звучить так: Ім'я член_списку, якщо Ім'я - його перший елемент, або якщо Ім'я - член хвоста.

Директивне і процедурне програмування.

Роботу предиката член_списку можна розглядати з двох точок зору.

З декларативної точки зору вирази говорять: для даного списку „Ім'я” є його членом, якщо „Ім'я” є головою цього списку, а якщо це не так, то „Ім'я” є його членом, якщо воно є членом хвоста списку.

З процедурної точки зору ці вирази інтерпретуються так: щоб знайти член списку - знайдіть його голову, інакше знайдіть член хвоста.

Ці дві точки зору відповідають наступним запитам відповідно.

член_списку(2,[1,2,3,4]).

член_списку(Х,[1,2,3,4]).

Перший вказує на необхідність перевірити істинність чогось, другий - на необхідність знайти всі члени списку.

Рекурсія з процедурної точки зору.

Часто коли ми будуємо вирази для предиката з однієї точки зору, вони працюють з іншої точки зору і навпаки.

Розглянемо цю подвійність на прикладі приєднання одного списку до іншого. Основним предикатом буде приєднати(список1, список2,список3), де список1 і список2 об'єднуються в список3.

Використаємо рекурсію з процедурної точки зору:

Якщо список1 порожній то результатом буде список2.

Якщо ж список1 не порожній, то список1 і список2 можна об'єднати в список3, якщо голову першого списку зробитит головою третього (змінна Y). Хвіст третього списку - це С3. Він складається з залишків першого і всього другого списку.

domains

список1,список2,список3=integer*

predicates

приєднати(список1,список2,список3)

clauses

приєднати([ ],Список2,Список2).

приєднати([Y|C1],Список2,[Y|C3]):-приєднати(C1,Список2,C3).

Предикат приєднати працює наступним чином, доки: рекурсивне правило перекидує по першому елементу в список3. Коли список1 порожній, перший вираз гарантує, що список2 приєднається до кінця результуючого списку. Запустимо цю програму з наступною метою:

приєднати([1,2,3],[5,6],С).

Виклик

Y

С1

список2

С3

приєднати([1,2,3],[5,6],С)

1

[2,3]

[5,6]

[1,2,3,5,6]

приєднати([2,3],[5,6],С)

2

[3]

[5,6]

[2,3,5,6]

приєднати([3],[5,6],С)

3

[ ]

[5,6]

[3,5,6]

приєднати([ ],[5,6],С)

-

-

-

[5,6]

Розглядаючи приєднати з декларативної точки зору ми визначили відношення між трьома списками. Відношення залишається в силі і якщо список1 та список3 відомі, а список2 ні. Вони залишаються істинними навіть якщо є тільки список3.

Наприклад, приєднати(С1,С2,[1,2,3,4]).

В якості відповіді на цю мету Пролог знайде всі можливі значення списків С1 і С2, що можуть призвести до створення списку 1,2,3,4.

Стан аргументів предиката на момент виклику називається структурою потоку. Аргумент, що має значення на момент виклику, називається вхідним аргументом, а вільний аргумент називається вихідним. Предикат приєднати здатний підтримувати будь-яку структуру потоку. Такі вирази називають інвертуємими виразами. Далеко не всі предикати можна викликати з різними структурами потоку.

Інвертуємі вирази, а точніше їх використання, підвищує потужність відповідних предикатів, роблячи їх універсальними.

Находження всіх рішень відразу.

В Пролозі існує вбудований предикат findall, який збирає всі рішення в один список.

findall(Ім'я,предикат,Список) ,

де Список представляє собою змінну для зберігання списку всіх можливих рішень виразу предикат для змінної Ім'я.

Приклад.

ch08ex08.pro

domains

ім'я,адреса=string

вік=integer

список=вік*

predicates

людина(ім'я,адреса,вік)

сум_список(список,вік,integer)

goal

findall(Вік,людина(_,_,Вік),С),

сум_список(С,Сума,N),

середнє=Сума/N,

write(„Середній вік: ”, Середнє),nl.

clauses

сум_список([ ],0,0).

сум_список([Г|Х],Сума,N):-сум_список(X,S1,N1),

Сума=Г+S1,

N=N1+1.

людина(„Шерлок Холмс”,”22b Baker Street”,42).

людина(„Доктор Ватсон”,”22b Baker Street”,34).

людина(„Фреди Крюгер”,”Вязов, 11”,48).

Вираз findall в цій програмі створює список С, в який збираються всі значення віку з предикату людина. Наприклад, якщо нам було б потрібно зібрати список з тих, кому 19 потрібно було б задати мету findall(Хто,людина(Хто,_19),С).

Тема 8. Арифметичні та логічні операції

Арифметичні операції.

Пролог дозволяє виконувати чотири арифметичних операції додавання (+), віднімання (-), множення (*), ділення (/), а також операції цілочисельне ділення (div) та залишок від цілочисельного ділення (mod).

Тип результату цих операцій в залежності від типу операндів можна побачити в наступній таблиці.

Операнд1

Операція

Операнд2

Результат

Цілий

+,-,*

Цілий

Цілий

Речовинний

+,-,*

Цілий

Речовинний

Цілий

+,-,*

Речовинний

Речовинний

Речовинний

+,-,*

Речовинний

Речовинний

Цілий або речовинний

/

Цілий або речовинний

Речовинний

Цілий

div

Цілий

Цілий

Цілий

mod

Цілий

Цілий

Пріорітет арифметичних операцій можна подивитись в наступній таблиці.

Операції

Пріорітет

+ , -

1

* , /

2

mod, div

3

( )

4

Арифметичні вирази на Пролозі можуть включати в себе операнди (константи або змінні), знаки операцій та круглі дужки. В першу чергу виконуються команди, що мають найбільший номер пріорітету. Якщо у виразі стоять операції з однаковим рівнем пріорітету, то вони будуть виконуватися зліва направо.

Логічні операції.

В Пролозі існують наступні логічні операції: менше (<), менше та дорівнює (<=), дорівнює (=), більше (>), більше та дорівнює (>= ) і не дорівнює (<> або ><).

Приклад.

X=9+Y

Якщо змінна X на момент виклику є вільною, то знак „=” працює як арифметична операція, тобто змінна X буде пов'язана значенням результату арифметичної операції, тобто 9+Y. Якщо ж змінна X на момент виклику пов'язана значенням, то знак „=” працює як логічна операція порівняння виразів ліворуч і праворуч від цього знаку. В будь-якому випадку змінна Y повинна бути пов'язана значенням.

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

Приклад.

'а'<'b'

peter>sally

“олександр”<“олександра”

В даних випадках порівнюються не самі літери, а їх коди.

При використанні порівняння з речовинними числами потрібно враховувати те, що речовинні числа представляються наближено. Наприклад, вираз 4.99999=5.00000 не буде істинним. В цьому випадку потрібно перевіряти не безпосередню рівність одного числа іншому, а те що вони наближені одне до одного з певною похибкою: X-Y<0.0001.

Тема 9. Введення, виведення інформації. Використання файлів

Введення та виведення інформації.

В Пролозі для введення інформації використовується предикат read, а для виведення - предикат write.

Введення інформації можливе з наступних пристроїв:

Ї з послідовного комунікаційного порту (com1,com2);

Ї з клавіатури (con);

Ї з файлу (файловий домен).

Виведення інформації можливе на наступні пристрої:

Ї на послідовний комунікаційний порт (com1,com2);

Ї на екран (screen);

Ї на принтер (printer);

Ї в файл (файловий домен).

Предикати read та write завжди працюють з поточним приcтроєм введення/виведення відповідно. По умовчанню поточний пристрій введення - клавіатура, а виведення - екран.

Для того, щоб використати будь який з інших пристроїв введення або виведення потрібно його активізувати, тобто зробити поточним пристроєм введення або виведення.

Для визначення поточного пристрою введення використовується предикат readdevice(пристрій), а виведення - writedevice(пристрій). В якості пристрію потрібно вказати відповідне скорочення, а у випадку файлу - файловий домен.

Приклади.

readdevice(com1).

writedevice(printer).

Використання файлів.

Предикати Пролога для роботи з файлами.

Ї deletefile(name) - знищує файл з іменем name на диску.

Ї save(name) - зберігає файл з іменем name.

Ї renamefile(old_name,new_name) - змінює ім'я файлу old_name на new_name.

Ї existfile(name) - задовільнюється, якщо в поточному каталозі є файл з іменем name.

Ї flush(пристрій) - очищує внутрішній буфер для поточного пристрою виведення.

Ї dir(Path,File_Spec,Name) - предикат dir видає каталог імен з каталогу Path, що мають розширення File_Spec; далі потрібно вибрати з них необхідний і натиснути Enter - змінна Name буде пов'язана з іменем вибраного файлу.

Ї disk(Path). Якщо Path відповідає коректному шляху до каталога, то цей каталог стає поточним. Якщо Path на момент виклику є вільною змінною, то вона пов'язується значенням поточного каталогу.

Ї eof(файловий_домен) - завершується успішно, якщо показчик поточної позиції знаходиться в самому кінці файлу.

Опис файлового домена.

Для того, щоб в програмі мати доступ до файлів, необхідно описати файловий домен. Файловий домен описується наступним чином:

file=datafile

При описі файлових доменів особливістю є те, що тип домена (file) задається ліворуч від знаку „=”, а ім'я домену - праворуч. Останне є ідентифікатором, який може бути пов'язаний з іменем конкретного файлу.

Робота з файлами.

Запис в файл.

Для запису в файл використовується наступна послідовність команд.

1.Створити або відкрити файл для запису:

openwrite(datafile,”PN-00.dat”),

де datafile - оголошений користувачем файловий домен, ”PN-00.dat” -ім'я файлу. Предикат openwrite встановлює зв'язок між файловим доменом і файлом на диску. Цей зв'язок залишається доти, доки відповідний файл не закрито. Якщо на момент виклику в поточному каталозі існує файл з таким іменем, то його вміст буде втрачено. Для запобігання цьому необхідно використовувати предикат existfile(”PN-00.dat”).

2.Зробити відкритий файл поточним пристроєм виведення:

writedevice(datafile).

3.Використовувати будь-які предикати сімества write для запису в файл необхідної інформації, та інші команди.

4.Закрити файл:

closefile(datafile).

5.Знов зробити попточним пристроєм виведення екран (не забувайте це робити!):

writedevice(screen).

Читання з файлу.

openread(datafile,”PN-00.dat”),

readdevice(datafile),

read(…),

. . .

closefile(datafile),

readdevice(con).

Модифікація існуючого файлу.

openmodify(datafile,”PN-00.dat”),

writedevice(datafile),

write(…),

. . .

closefile(datafile),

writedevice(screen).

Дозапис в кінець існуючого файлу.

openappend(datafile,”PN-00.dat”),

writedevice(datafile),

write(…),

. . .

closefile(datafile),

writedevice(screen).

Приклад.

Наступний фрагмент виконує посимвольне читання файлу і посимвольне виведення на екран і принтер одночасно.

process_input_output:-write(„Введіть ім'я файлу ”), nl,

readln(FileName),

openread(datafile,FileName),

readdevice(datafile),

read_and_print,

closefile(datafile),

readdevice(con).

read_and_print:-not(eof(datafile)),

readchar(Y),

write(Y),

writedevice(printer),

write(Y),

flush(printer),

writedevice(screen),

read_and_print.

Використання файлів прямого доступу.

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

Приклад.

База даних студентів групи має таку структуру:

Прізвище

Ім'я

По-батькові

Дата народження

2

15

10

14

8

50

0

2

17

27

41

50

52

67

77

91

...

...

...

...

Для того, щоб прочитати прізвище 10-ї людини в списку потрібно показчик встановити в позицію, що визначається наступною формулою:

позиція=номер_запису*розмір_запису+зміщення_потрібного_поля.

позиція=10*50+2=502.

Для змінення позиції показчика використовується предикат

filepos(file_name,file_pos,mode),

де mode визначає як буде інтерпретоване значення file_pos і може мати три значення:

0

зміщення береться від початку файлу;

1

зміщення береться від поточної позиції показчика файлу;

2

зміщення береться від кінця файлу.

Тема 10. Використання вікон, графіки та звуку

Предикати для роботи з вікнами.

Створення вікна.

Створення вікон відбувається за допомогою предиката

makewindow (window_number, screen_attribute, frame_attribute, frame_string, starting_row, starting_column, window_height, window_width)

Параметр window_number - ціле число, що ідентифікує номер вікна в програмі.

Параметр screen_attribute - ціле число, що вказує колір символів і колір фону у вікні. Параметр screen_attribute визначається шляхом додавання коду фона і коду текста. Код фона та код тексту знаходять згідно таблиці.

Колір

Код тексту

Код фону

чорний

0

0

синій

1

16

зелений

2

32

блакитний

3

48

червоний

4

64

фіолетовий

5

80

коричневий

6

96

білий

7

112

сірий

8

--

світло-синій

9

--

світло-зелений

10

--

світло-блакитний

11

--

світло-червоний

12

--

світло-фіолетовий

13

--

жовтий

14

--

інтенсивно-білий

15

--

Якщо додати до результуючого значення 128, то символи будуть блимати.

Параметр frame_attribute - ціле число, що визначає вигляд рамки вікна. Значення атрибуту визначається з таблиці.

Frame_attribute

Вигляд рамки вікна

0

немає рамки

1

синя рамка

2

зелена рамка

3

світло-синя рамка

4

червона рамка

5

фіолетова рамка

6

жовта рамка

7

біла рамка

8

коричнева рамка

-1

біла рамка, що блимає

-2

жовта рамка, що блимає

-3

фіолетова рамка, що блимає

-4

червона рамка, що блимає

-5

світло-синя рамка, що блимає

-6

світло-зелена рамка, що блимає

-7

синя рамка, що блимає

-8

сіра рамка, що блимає

Параметр frame_string є необов'язковим. В якості цього параметра в подвійних лапках вказується позначка вікна, яка буде розташовуватись в центрі верхньої лінії рамки вікна. Якщо параметр не заданий, позначка вікна буде відсутня.

Параметр starting_row - ціле число, що визначає номер верхнього рядка вікна (змінюється від 0 до 24).

Параметр starting_column - ціле число, що визначає номер крайнього лівого стовпчика вікна (змінюється від 0 до 79).

Параметри window_height і window_width - цілі числа, що задають розмір вікна, тобто кількість рядків та кількість стовпчиків у вікні відповідно.

Приклад.

makewindow(2,4,1,”Меню”,4,20,16,40)

Якщо встановити розміри вікна такими, що вікно не вміщується на екрані, то буде видане повідомлення про помилку.

Інші предикати для роботи з вікнами.

Предикат shiftwindow(window_number) використовується для змінення поточного вікна. Поточним стає вікно з номером window_number.

Предикат clearwindow використовується для очищення поточного вікна.

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

Використання звуку та музики.

Предикат beep використовується для генерації коротких звуків високої тональності.

Предикат sound призначений для генерації звуків певної тривалості (задається в сотих долях секунди) і частоти (задається в герцах):

sound(тривалість,частота)

В наступній таблиці наводяться приблизні частоти для музичних нот.

Нота

Частота

до

262

до#

278

ре

294

ре#

302

мі

330

фа

350

фа#

370

соль

392

ля

416

ля#

440

си

466

до

524

Тема 11. Експертні системи

Призначення та особливості експертних систем (ЕС).

Пiд експертною системою розумiється система, яка об'єднує можливостi компьютера зi знаннями та досвiдом експерта в такiй формi, що система може запропонувати РОЗУМНУ ПОРАДУ або здiйснити РОЗУМНЕ РОЗВ'ЯЗАННЯ поставленої задачi. Додатково бажаною характеристикою такої системи є здатнiсть пояснювати, якщо є така потреба, ХIД СВОЇХ МIРКУВАНЬ в зрозумiлiй для користувача формi.

Експертні системи - системи, орієнтовані на знання, і містять знання одного або декількох експертів деякої проблемної області. Експертні системи можуть виявитися корисними у ряді проблемних областей: діагностика, планування, проектування, освіта та ін., тобто в областях прийняття рішень.

Як правило, задачі мають властивість бути неповними, помилковими, неоднозначними. ЕС не відкидають і не замінюють традиційного підходу до програмування, вони відрізняються від традиційних програм, тим що орієнтовані на розв'язання неформалізованніх задач і мають наступні особливості:

Ї алгоритм розв'язання наперед невідомий, а побудований самою ЕС за допомогою символічних міркувань, які базуються на евристичних прийомах;

Ї ясність розв'язань, тобто система усвідомлює, як вона отримала розв'язання;

Ї здатність аналізу та пояснення своїх дій та знань;

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

Ї забезпечення дружнього интерфейсу.

На відміну від машинних програм, що використовують процедурний аналіз, ЕС вирішують задачі у вузькій предметній області на основі дедуктивних міркувань. Такі системи часто виявляються здатними знайти рішення задач, що є неструктурованими і погано визначеними. Вони справляються з відсутністю структурованості шляхом залучення евристик, тобто правил, узятих "зі стелі", що може бути корисним у тих системах, де недолік необхідних знань або часу виключає можливість проведення повного аналізу.

На даний момент ЕС використовується для розв'язання задач наступних типів:

Ї прийняття рішень в умовах невизначеності (неповноти інформації);

Ї інтерпритація символів і сигналів, прогнозування, діагностика, конструювання, планування, контроль, управління.

Результат дії представляєтся у вигляді інтелектуальної поради.

Великий iнтерес до ЕС з боку користувачiв викликаний трьома причинами. По-перше, вони зорієнтовані на розв'язання широкого кола задач в неформалізованних областях. По-друге, за допомогою ЕС спеціалісти, які не знають програмування, можуть самостійно разробляти додатки, які їх цікавлять. По-третє, ЕС при розв'язанні практичних задач досягають результатів, які не поступаються, а іноді навіть і кращі за рішення людей-експертів.

На сьогодняшній день ведуться розробки ЕС для наступних додатків: раннє попередження національних та міжнародних конфліктів; прийняття рішень в кризових ситуаціях; охорона правопорядку; освіта; технічна галузь та ін.

Дослідження і розробка ЕС складають основу програм з інформатики розвинених держав. Не дивлячись на значну вартість розробки, ЕС приносять суттевий прибуток.

Складові експертної системи.

На рисунку зображена структурна схема експертної системи, складовими якої є наступні елементи з такими характеристиками:

Ї База знань - центральна частина експертної системи. Вона містить правила, що описують відношення або явища, методи і знання для рішення задач з області застосування системи. База знань складається з фактичних знань і знань, що використовуються для виведення нових знань.

Ї Розв'язувальний блок, використовучи дані користувача та знання із бази знань, формує таку послідовність правил, які приводять до розв'язання. Блок існує для пошуку та побудови умовиводів. Дії цього блоку аналогічні міркуванням людини-експерта, яка оцінює проблему та пропонує її гіпотетичні розв'язання. Розв'язувальний блок управляє процесом пошуку розв'язання та визначає спосіб і послідовність застосування різних правил.

Ї Модуль накопичення знань - автоматизує процес накопичення ЕС знаннями, який здійснюється користувачем-експертом. Він отримує нові знання та включає їх до існуючої бази знань таким чином, щоб вони не протирічили існуючим знанням.

Ї Модуль пояснення - пояснює, як система отримала розв'язання задачі або чому вона не отримала відповіді і які знання вона при цьому використала, що полегшує експерту тестування системи та підвищує довіру користувачів до отриманного результату.

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

Інтенсіональні знання - понятійні, концептуальні знання відносно класів об'єктів предметної області та їх відношень.

Екстансіональні знання - кількісні характеристики знань інтенсіональної частини.

Розробка експертних систем.

В розробці беруть участь представники наступних спеціальностей:

Ї Експерт або група експертів в тій проблемній області, задачі якої буде розв'язувати ЕС.

Ї Інженер по знанням - спеціаліст з розробки ЕС.

Ї Програміст - спеціаліст з розробки инструментальних засобів.

Експерт визначає знання (дані та правила), які характеризують проблемну область, забезпечує повноту та вірність введених в ЕС знань.

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

Програміст розробляє інструментальний засіб, який містить всі компоненти ЕС, здійснює з'єднання інструментального засобу з тим середовищем в якому воно буде працювати.

Відсутність інженера по знанням, тобто заміна його програмістом призводить або до повної невдачі процесу створення ЕС, або значно збільшить час її створення.

ЕС працює в двох режимах: режимі набуття знань та режимі консультації.

ЕС, як і будь-який складний об'єкт можна визначити лише сукупністю характеристик:

Ї призначення;

Ї проблемна область;

Ї глибина аналізу проблемної області;

Ї тип використанних методів та знань;

Ї клас системи;

Ї стадія існування;

Ї інструментальні засоби;

Етапи розробки ЕС.

Розробка (проектування) ЕС суттєво відрізняється від розробки звичайного програмного продукта. Неформалізованість задач, які розв'язуються ЕС, відсутність завершенної теорії ЕС та методології їх розробки призводять до необхідності модифікувати принципи та способи побудови ЕС в ході процесу розробки по мірі того, як зростають знання розробників про проблемну область.

Взагалi прi створеннi ЕС слiд врахувати такi особливостi їх використання:

Ї Найдорожчою частиною ЕС є не програмне забезпечення, а сам експерт, його пiдготовка. Тому головне зусилля має бути спрямоване на правильний вибiр експерта з данної предметної галузi знань.

Ї ЕС має мiстити не тiльки експертнi оцiнки спецiалiстiв, а й елементи фундаментальних знань, оскiльки експерт часто приймає рiшення на пiдставi досвiду та iнтуіцiї, тобто деяких статичних i логiчних оцiнок, не аналiзуючи глибинних фiзичних основ явищ.

Перед тим, як приступити до розробки ЕС, інженер по знанням повинен розглянути питання, чи слід розробляти ЕС для данного додатку. Використовувати ЕС слід лише тоді, коли розробка ЕС можлива, виправдана і методи інженерії знань відповідають задачам, що розв'язуються.

Етап ідентификації - ідентифікується задача та визначаються учасники процесу проектування та їх ролі, ресурси та цілі. Ідентифікація задачі - це складання неформального опису задачі (загальні характеристики задачі, підзадачі, ключові поняття, характеристики та відношення; вхідні та вихідні дані, знання, приклади розв'язання задачі). Мета етапа - охарактеризувати задачу та структуру її знань і таким чином забезпечити початковий імпульс для розвитку бази знань.

Етап концептуалізації - експерт та інженер по знанням використовують основні поняття, відношення та характеристики, необхідні для опису процесу розв'язання задачі. На цьому етапі визначаються наступні особливості задачі:

Ї типи доступних даних;

Ї вхідні та вихідні дані;

Ї підзадачі;

Ї типи взаємозв'язків між об'єктами проблемної області;

Ї типи відношень тощо.

Етап формалізації - всі ключові поняття та відношення, введені на етапі концептуалізації, виражаються на деякій формальній мові, обраній інженером по знанням.

Етап виконання - створення одного або декількох прототипів ЕС, які розв'язують необхідні задачі. Розробка прототипів складається у програмуванні їх компонентів або виборі їх із існуючих інструментальних засобів.

Етап тестування - оцінка обранного способу представлення знань у ЕС. Як тільки ЕС буде здатна обробляти до кінця два або три приклади, необхідно розпочинати перевірку на більш широкому колі прикладів, щоб визначити недоліки бази знань та управляючого механізму. Інженер по знанням повинен підібрати приклади, які забезпечать всебічну перевірку ЕС.

Етап дослідної експлуатації - перевіряється придатність ЕС для кінцевого користувача. На цьому етапі ЕС розв'язує різноманітні задачі при роботі з різними користувачами. До цього етапу слід переходити лише після того, як система, на думку експерта, буде успішно розв'язувати практично всі необхідні задачі.

Потім за результатами етапів тестування та дослідної експлуатації створюється кінцевий продукт, пригодний для промислового використання.

В ході створення ЕС майже постійно здійснюється її модифікація.

Види модифікації:

Ї удосконалення прототипу;

Ї переконструювання прототипу - повернення від етапу тестування до етапу формалізації;

Ї переформулювання - повернення від тестування до етапу концептуалізації та ідентифікації (проектування „з нуля”).

Проектування структури експертної системи.

База знань.

Формулювання знань першого та другого роду.

Знання, які має спеціаліст в якій-небудь області можна поділити на знання першого роду (формалізовані, точні) і знання другого роду (неформалізовані, неточні).

Формалізовані знання формулюються в книгах та посібниках у вигляді загальних та строгих суджень (законів, формул, моделей, алгоритмів тощо), які відбивають універсальні знання.

Неформалізовані знання, як правило не потрапляють до книг та посібників в зв'язку з їх конкретністю, суб'єктивністю та приблизністю. Знання цього роду є результатом узагальнення багатолітнього досвіду роботи та інтуіції спеціалістів. Вони зазвичай представляють собою різноманіття емпірічних (евристичних) прийомів та прaвил.

Задачі, які розв'язуються на основі точних знань, називаються формалізованими, а задачі, що розв'язуються за допомогою неточних знань називаються неформалізованими.

Традиційне програмування в якості основи для розробки програми використовує алгоритм, тобто формалізоване знання. Тому до недавнього часу вважалося, що ЕОМ не придатні для розв'язання неформалізованних задач. Розширення сфери використання ЕОМ засвідчило, що неформалізовані задачі представляють дуже важливий клас задач. Невміння розв'язувати неформалізовані задачі стримує впровадження ЕОМ в повсякденне життя людини.

Представлення знань у базі - це безліч угод по синтаксису і семантиці, згідно яких описуються об'єкти. Гарне правило при проектуванні баз знань - це організація знань у такій формі, що дозволяє легко здійснювати доступ за допомогою природних і простих механізмів ("Чим простіше, тим краще").

Існує два основних способи представлення знань.

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

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

Розв'язувальний блок.

Розв'язувальний блок необхідний для пошуку та побудови відповідей-висновків. Дії цього блоку аналогічні міркуванням експерта-людини, який оцінює проблему та пропонує її гіпотетічне розв'язання.

Розв'язувальний блок керує процесом пошуку розв'язання, він визначає спосіб та послідовність застосування різних правил. Він повинен враховувати всі можливі розв'язання-відповіді, що знаходяться в базі знань і підібрати найоптимальніше рішення, виходячи з інформації (правил), яка знаходиться в базі знань.

В складних ЕС, якщо робиться виведення більше одного твердження, то розв'язувальний блок повинен зробити певний вибір - перевага віддається правилам, які більш конкретні, або враховують більше фактів. Тобто в гарній ЕС розв'язувальний блок повинен володіти процесом розв'язання конфліктів, підбором найоптимальнішого варіанту серед декількох альтернатив.

Модуль спілкування з користувачем.

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

Для забезпечення мінімальної зручності при користуванні, модуль спілкування повинен забезпечувати наступні функції:

Ї Обробка даних, отриманних з клавіатури та висвічування введених та виведенних даних на екрані. Введення/виведення повинно відбуватися швидко, ясно, виразно. За бажанням можна також включити роботу з файлами та принтером.

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

Ї Розпізнавання ситуації нерозуміння між користувачем та системою (захист від введення користувачем невірної інформації).

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

Ї Забезпечення “дружнього” ставлення по відношенню до користувача. “Дружність” системи до користувача виявляється у застосуванні мови спілкування, максимально наближеної до природної людської мови, зручних засобів інтерфейсу (меню) та інше.

У режимі консультації спілкування з ЕС здійснює кінцевий користувач, якого цікавить результат та спосіб отримання результату. Користувач в залежності від призначення ЕС може не бути спеціалістом в даній проблемній області, в цьому випадку він звертається до ЕС, щоб отримати пораду, яку він не може отримати сам. Або користувач може бути спеціалістом, в цьому випадку він звертається до ЕС з тим, щоб прискорити процес отримання результату, або щоб не робити рутинну роботу. Термін "користувач" є багатозначним, оскільки окрім кінцевого користувача працювати з ЕС може і експерт, і інженер зі знань, і програміст.

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

Ї розподіляє ролі учасників (користувача та ЕС) та організує їх взаємодію в процесі неоперативного розв'язання задачі;

Ї трансформує дані користувача про задачу, представлені на звичній для користувача мові, у внутрішню мову системи;

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

На відміну від традиційних програм ЕС в режимі розв'язання задачі не лише виконує необхідну послідовність операцій, але й попередньо формує її. Якщо відповідь ЕС не зрозуміла користувачу, тоді він може вимагати пояснень після, того як була отримана відповідь.

Модуль накопичення знань.

Модуль накопичення знань дуже важливий модуль, бо ЕС існує не лише для отримання поради на базі старих знань, закладенних інженером по знанням на етапі розробки, а і повинна вміти оволодівати новими знаннями, постійно їх накопичувати, перетворивши їх структуру у відповідність до внутрішньої структури бази знань ЕС.

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

Дані визначають об'єкти, їх характеристики та значення, які існують в області експертизи. Правила визначають способи маніпулювання даними, які характерні для данної проблемної області. Експерт, використовуючи модуль накопичення знань, наповнює систему знаннями, які дозволяють ЕС в режимі розв'язання самостійно без експерта розв'язувати задачі в проблемній області.

У режимi здобуття знань у спiлкуваннi з ЕС бере участь експерт через посередництво iнженера-програмiста. В цьому режимi експерт наповнює систему знаннями (правилами), якi дають змогу їй у режимi розв'язування самостiйно розв'язувати задачi. Режиму здобуття знань при традицiйному пiдходi до розробки програм вiдповiдають етапи алгоритмiзацiї, програмування та налагодження, що виконуються програмiстом.

Модуль накопичення знань повинен надати можливість вирішення двох проблем:

Ї накопичення знань експерта (забезпечення зручного та зрозумілого інтерфейсу для роботи спеціаліста);

Ї автоматизоване формування нових знань.

Знання здобутті першим або другим шляхом повинні бути включені до існуючої бази знань (з відповідною структурою) з умовою, щоб вони не протирічили вже існуючим знанням. Якщо таке протиріччя виникає, тоді розробники повинні передбачити механізм розв'язання цієї проблеми.

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

1. Визначається необхідність модифікації (розширення) знань;

2. У разі модифікації здобуваються нові знання, в противному випадку процес здобуття знань закінчується;

3. Нові знання перетворюються у форму, “зрозумілу” ЕС;

4. Знання системи модифікуються й здійснюється перехід до першої дії.

У режимі здобуття знань експерт вводить правила про галузь експертизи, що подаються природною мовою. Об'єднання нових правил з базою знань здійснює модуль накопичення знань.

Модуль поясненнь.

В кожній ЕС повинен бути присутній модуль пояснень, до задачі якого входить пояснювати прийняте рішення, грунтуючись на певних правилах із бази знань; розкривати хід своїх дій, щоб користувачу було зрозуміло на основі чого було обране те чи інше рішення.

Модуль порад i пояснень є важливим не тiльки для користувача системи, а й для експерта, що подає знання в конкретнiй предметнiй галузi, оскiльки дає змогу останньому визначати, як працює система i як використовуються поданi ним вiдомостi.

Оскільки відповідальність за прийняте рішення несе користувач, а не ті експерти, знання яких були покладені в основу ЕС, і не програмісти, які реалізували цю систему, то модуль пояснень обов'язково повинен бути в будь-якій ЕС.

Саме завдяки пояснювальному компоненту експерт на етапі тестування локалізує причини невдалої роботи ЕС, що дозволяє експерту цілеспрямовано модифікувати старі або вводити нові знання. Звичайно пояснювальний компонент повідомлює наступне: як правила використовують інформацію користувача; чому використовувались або не використовувались дані або правила; які були зроблені висновки тощо. Всі пояснення робляться, як правило, на обмеженній природній мові або на мові графіки.

Размещено на Allbest.ru


Подобные документы

  • Огляд переваг та недоліків мови Пролог, історія її створення. Числення предикатів як математична основа її функціонування. Порівняльна характеристика середовищ програмування Prolog. Алгоритми розв’язування математичних задач за допомогою цієї мови.

    курсовая работа [504,5 K], добавлен 23.12.2014

  • Характеристика мови програмування VBA (Visual Basic for Application): можливості й засоби. Використання редактора Visual Basic. Створення та виконання VBA-програм. Типи даних, змінні й константи, операції й вирази. Керуючі оператори, процедури й функції.

    реферат [29,9 K], добавлен 28.06.2011

  • Програми і мови програмування. Алфавіт мови програмування. Лексеми, зарезервовані слова мови Pascal. Ідентифікатори, типи даних. Арифметичні вирази, операції. Стандартні функції, структура програми. Процедури введення-виведення. Правила написання команд.

    лекция [445,0 K], добавлен 24.07.2014

  • Javascript як мова програмування, заснована на об'єктах: і мовні засоби, і можливості середовища представляються об'єктами. Структура програм на мові Javascript. Декларація змінних та сфер їх впливу. Типи даних та їх використання. Пріоритети операцій.

    курсовая работа [51,4 K], добавлен 12.12.2010

  • Робота з цілими значеннями за допомогою арифметичних команд. Механізм роботи команд передачі керування мови Assembler. Типи даних "FPU" та система регістрів. Програма та її структура на мові Assembler, робота з директивами. Текстовий режим відеоадаптера.

    лабораторная работа [1,7 M], добавлен 31.05.2014

  • Теоретичні основи та приклади економічних задач лінійного програмування. Розробка математичної моделі задачі (запис цільової функції і системи обмежень) і програмного забезпечення її вирішення за допомогою "Пошуку рішень" в Excel симплекс-методом.

    курсовая работа [993,9 K], добавлен 10.12.2010

  • Дослідження проблеми пошуку автомобілів та постановка задачі створення автокаталогу з використанням мови програмування PHP і JаvаScrіpt. Дослідження моделей прецедентів системи та їх класової архітектури. Моделювання розподіленої конфігурації систем.

    курсовая работа [3,7 M], добавлен 11.10.2010

  • Теоретичні основи мови програмування C++ та середовища розробки Microsoft Visual C++, яка дозволяє створювати як маленькі программи і утиліти для персонального використання, так і корпоративні системи, що працюють з базами даних на різних плтаформах.

    реферат [26,5 K], добавлен 01.04.2010

  • Використання мови програмуванння Java при виконанні "задачі лінійного програмування": її лексична структура і типи даних. Методи розв’язання задачі. Особливості логічної структури програми, побудова її зручного інтерфейсу за допомогою симплекс методу.

    курсовая работа [437,9 K], добавлен 24.01.2011

  • Види списків, особливості їх створення, застосування та можливості удосконалення роботи користувача персонального комп’ютера. Керування та аналіз груп споріднених даних у середовищі програми MS Excel 2010. Опрацювання спискiв за допомогою форми даних.

    дипломная работа [2,7 M], добавлен 18.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.