Інтерпретатор мови Пролог

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

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

Зміст
"1-3" Вступ ............................................ .................................................. ............ 4
1. Дослідницька частина ................................................ ............................. 8
1.1. Роль реляційних мов у розвитку обчислювальної техніки .......... 8
1.2. Основні механізми дедукції ............................................... ............. 10
1.3. Обчислення предикатів як мову для вирішення завдань .......................... 12
1.3.1 Уніфікація і принцип резольвенціі в численні предикатів ...... 13
1.3.2. Методи пошуку докази в численні предикатів ................ 15
1.3.2.1. Обчислення предикатів при вирішенні завдань ................................... 15
1.3.2.2. Стратегії перебору ................................................ ......................... 16
1.3.2.3. Стратегії спрощення ................................................ ...................... 17
1.3.2.4. Стратегії очищення ................................................ ........................ 18
1.3.2.5. Форми докази з відфільтровування попередніх вершин. 4
1.3.2.6. Стратегії підтримує безлічі ......................................... 4
1.3.2.7. Стратегії впорядкування ................................................ ................... 5
1.4. Аналіз характеристик існуючих інтерпретаторів ...................... 6
1.5. Необхідність розробки інтерпретатора мови Пролог ................. 8
1.6. Вибір мови програмування ............................................... ............ 8
2. Конструкторська частина ................................................ ............................. 10
2.1. Синтаксис програм на Пролозі в нотації Бекуса-Наура ................. 10
2.2. Загальна структура інтерпретатора ............................................... ......... 10
2.2.1. Принцип роботи предкомпілятора ............................................... .... 11
2.2.1.1. Робота лексичного аналізатора ............................................... .... 11
2.2.1.2. Синтаксичний аналізатор ................................................ ............ 12
2.2.1.3. Аналіз арифметичного вираження ............................................. 13
2.2.1.4. Аналіз параметрів предикатів ............................................... ....... 15
2.2.1.5. Перевірка типів параметрів ............................................... ............. 15
2.3. Робота інтерпретатора ................................................ .......................... 16
2.3.1. Виконання звернень до баз даних ........................................... 18
2.3.2. Обчислення арифметичних виразів .......................................... 19
2.4. Об'єкти, використовувані компілятором і інтерпретатором ............... 19
2.4.1. Об'єкти змінних TPrologVariable, TPrologVariables, TPrologVariableList, TPrologVariableStruct ......................................... ........................................... 19
2.5.2. Стандартні функції і предикати .............................................. ..... 21
2.6. Представлення Пролог-програми у вигляді об'єктів ........................... 21
2.7. Основні модулі ................................................ ................................... 23
2.8. Демонстраційна програма з вибору конфігурації комп'ютера. 25
3. Технологічна частина ................................................ .............................. 28
3.1. Вимоги до експлуатації інтерпретатора мови Пролог ............. 28
3.2. Встановлення системи ................................................ ................................. 28
3.3. Керівництво користувача програми інтерпретатора мови Пролог. 29
3.3.1. Запуск програми ................................................ .............................. 29
3.3.2. Перелік функцій, реалізованих системою ....................................... 29
3.3.3. Редагування Пролог-програми .............................................. ... 29
3.3.4. Запуск програми на Пролозі і її налагодження ..................................... 34
3.3.5. Робота з меню ............................................... ....................................... 35
3.4. Опис процесу виконання програми, написаної мовою Пролог. 38
3.5. Загальні відомості про інтерпретаторі .............................................. ........ 39
3.6. Особливості роботи Пролог-програми з базами даних ................ 39
3.7. Опис стандартних предикатів ............................................... ........ 40
3.8. Опис функцій ................................................ .................................. 43
4. Організаційно-економічна частина .............................................. ...... 45
4.1. Розрахунок витрат на розробку інтерпретатора Пролог ......................... 45
5. Промислова екологія та безпека .............................................. .. 47
5.1. Введення ................................................. ................................................ 47
5.2. Аналіз характеру забруднення навколишнього середовища при виробництві обчислювальної техніки ......................................... ...................................... 48
5.2.1. Джерела забруднення ................................................ ....................... 48
5.2.2. Очищення повітря від шкідливих домішок ............................................. . 50
5.3. Аналіз впливу небезпечних і шкідливих факторів, при експлуатації програми інтерпретатора Пролог ...................................... .......................................... 52
5.3.1. Підвищений рівень шуму на робочому місці ................................. 53
5.3.2. Небезпечний рівень напруги електричного кола, замикання якого може відбутися через людину ...................................... ....................................... 54
5.3.3. Пожежна небезпека ................................................ ........................... 55
5.3.4. Підвищений рівень електромагнітних випромінювань ....................... 56
5.3.5 Підвищена яскравість світла ............................................ ...................... 57
5.3.6. Пряма і відбита бляклість .............................................. .......... 58
5.3.7. Порушення мікроклімату робочих приміщень ............................... 58
5.3.8. Захист від психофізіологічних факторів ..................................... 59
5.4. Аналіз використання захисних екранів для зниження впливу небезпечних і шкідливих факторів, під час роботи на автоматизованому робочому місці ......... 60
5.4.1 Основні функції захисних екранів, необхідні для зниження впливу шкідливих і небезпечних факторів, під час роботи з програмним засобом ........... 60
5.4.1.1. Захист від електростатичного та електромагнітного впливів. 61
5.4.1.2. Захист від рентгенівського випромінювання ............................................. 61
5.4.1.3. Захист від ультрафіолетового випромінювання ...................................... 61
5.4.2. аналіз основних типів захисних екранів, які прийнятні для зниження впливу шкідливих і небезпечних факторів, під час з програмним засобом. 62
5.4.2.1. Сітчастий (повний захист зору )............................................ .. 62
5.4.2.2. Скляний двошаровий з заземленням (повний захист зору, частковий захист здоров'я )..................................... .................................................. ... 62
5.4.2.3. Скляний багатошаровий з заземленням (повний захист зору, повний захист здоров'я )..................................... .................................................. ................ 63
5.5. Розрахунок необхідного звукопоглинання, при роботі з АРМ ............... 63
Висновок ................................................. .................................................. . 66
Література ................................................. .................................................. . 67
Програми ................................................. .................................................. 68
Додаток 1 ................................................ ................................................ 68
Додаток 2 ................................................ ................................................ 73
Додаток 3 ................................................ ................................................ 81
Додаток 4 ................................................ ................................................ 87


Введення

Розроблюваний програмний продукт призначений для візуального створення, редагування та інтерпретації програм, написаних на мові Пролог з можливістю роботи з універсальними базами даних.
Постійно зростаючий обсяг інформації, яку необхідно обробляти сучасних комп'ютерів пред'являє більш широкі вимоги до сучасних баз даних. Якщо на зорі розвитку комп'ютерної техніки база даних була звичайним файлом, який представляв собою типізований файл, до якого можна було звертатися за абсолютним номеру запису, то зараз база даних являє собою інтелектуальне середовище, яка включає в себе часом кілька таблиць з даними, пов'язаними між собою . Причому кінцевий користувач через складність структури бази не знає, в якому місці файлу зберігаються даними, з якими він працює. Сучасні бази даних володіють вбудованими можливостями захисту прав доступу, а також способами підтримки цілісності даних та їх несуперечності. Це досягається за рахунок включення в самі бази даних окремий частин програми, які діють незалежно від користувальницької програми як програми-сервери. Доступ до таблиць став значно простіше за рахунок використання мови SQL, який допомагає швидко вибирати потрібний користувачеві сегмент інформації із загального обсягу, також видаляти непотрібну інформацію і додавати нову.
Бази даних зараз використовуються не тільки як звичайні сховища інформації, але і як сховища знань. Тому з'являється нова вимога до баз даних, яке прийшло від баз знань, - це можливість логічного виведення нових знань із уже відомих, а також робота в режимі експертної системи.
У самому вузькому сенсі термін експертна система використовується для опису однієї з невеликого числа програм, розроблених загальновизнаними фахівцями в інженерії знань. Призначення цих програм полягає у відтворенні можливості вирішення завдань, які має експерт. Більшість експертних систем не може повністю замінити людину. Такі системи використовуються для підвищення ефективності роботи та розширення знань персоналу середньої кваліфікації.
У широкому сенсі експертна система - це будь-яка програма, що застосовується для експертних консультацій. Дане визначення охоплює всі програми, які використовуються в якості експертних систем, не враховуючи того моменту, що справжні експерти могли і не брати участь в створенні цих програм.
У будь-якій системі експертних консультацій обов'язково повинні бути наступні три компоненти:
1. Мова представлення знань, за допомогою якого можна інтуїтивно представити знання про складну області;
2. Стратегія вирішення завдань, що дозволяє виконувати дії з представленими знаннями настільки ж компетентно, як це роблять експерти-люди;
3. Інтерфейс з користувачем, що забезпечує природність і зручність доступу до знань, якими має програма, і здатний пояснювати свої відповіді, як недосвідченим користувачам, так і користувачам-експертам [1].
Традиційною мовою у створенні експертними систем є мова Пролог. Це класичний мова логічного програмування. Він має вбудований механізм виводу, що базується на принципі резолюцій, що допомагає формально звертатися зі знаннями. Крім того, мова Пролог є реляційною мовою програмування, тобто оптимально пристосований для роботи з реляційними базами даних. Так як Пролог оперує правилами, програмісту не потрібно замислюватися над програмуванням послідовності дій для машини, як це робиться при програмуванні на процедурних мовах. Програміст просто становить сукупність правил, що описує дану предметну область, а Пролог виконує складену програму, використовуючи алгоритм бектрекінга.
Як зазначалося раніше, важливим в експертній системі є інтерфейс з користувачем як професіоналам в даній галузі, так і непрофесіоналом. Внаслідок цього, інтерфейс з людиною повинен здійснюватися на природній мові. Так як Пролог є декларативною мовою і заснований на обчисленні висловлювань, то на ньому досить нескладно можна написати обробку природної мови.
Актуальним питанням завжди був вид представлення знань. Спочатку в Пролозі база знань зберігалася в текстовому файлі в форматі мови Пролог, який завантажувався у пам'ять, і компілювався під час виконання програми. Це було явним недоліком Прологу, оскільки ведення такої бази знань можливе тільки людиною і тільки вручну, тобто, використовуючи тільки текстовий редактор, а не якусь спеціалізовану програму. Це обмежувало можливості застосування Прологу. Крім цього, ще одним обмеженням було те, що Прологу доводилося завантажувати в пам'ять всю базу знань. Тобто, якщо оперативної пам'яті комп'ютера не вистачало, то програма не могла працювати.
Підключення до Прологу універсальних баз даних дозволяє зняти ці два обмеження. Універсальними базами даних можуть користуватися інші програми, які спеціалізовані для введення того або іншого формату представлення знань. Таким чином, збільшується швидкість і якість введення знань. Більше того, знання можуть додаватися прямо по ходу виконання Пролог-програми. Стає можливим надходження даних відразу з різних точок (з різних комп'ютерів).
Також використання баз даних дозволяє зняти обмеження на обсяг оперативної пам'яті комп'ютера, тому що менеджер баз даних вантажить у пам'ять тільки ті дані, які потрібні зараз, а не все відразу. Також не потрібна компіляція знань під час виконання програми, так як вони вже знаходяться в потрібному форматі. Використання баз даних уповільнює швидкість роботи програми, тому що їй доводиться звертатися до диска за даними, але менеджер баз даних дозволяє зменшити це уповільнення за рахунок кешування даних та випереджаючого читання.
Система, що розробляється дозволяє зняти високі вимоги до обсягу пам'яті комп'ютера, тому що використовує універсальні бази даних. Тепер база знань може зберігатися у файлі бази даних і завантажуватися в пам'ять комп'ютера за потребою. Використання баз даних дозволяє працювати з однією базою знань декількох програмах, а також надається можливість зручного редагування бази за допомогою інших програм. Завантаження та пошук записів в БД покладено на операційну систему, яка централізовано і ефективно розподіляє доступ до баз даних для кількох програм, а також за рахунок вбудованого кешування дозволяє знизити залежність швидкості виконання програми від швидкості роботи диска.
TPrologTerm = class (TObject)
TermType: TPrologTermType; / / тип терма
Data: pointer; / / покажчик на об'єктом з вмістом терма
x, y: integer;
constructor Create;
destructor Destroy; override;
end;
TTermsArray = array of TPrologTerm;
TProgramDomain = class (TObject)
/ / Внутрішній формат доменів
iType: TDomainTypes;
Name: string;
Params: TStrings;
ListParam: string;
constructor Create;
destructor Destroy; override;
end;
TProgramExtData = class (TObject)
Name: string;
Fields: TStrings;
FieldsTypes: TStrings;
FieldsLengths: TStrings;
FileName: string;
Table: TTable;
DataSource: TDataSource;
constructor Create;
destructor Destroy; override;
function Open: Boolean;
procedure Close;
end;
TPredicateClause = class (TObject)
Params: TVariablesArray;
Terms: TTermsArray;
x, y, Endx, EndY: integer;
constructor Create;
destructor Destroy; override;
end;
TProgramPredicate = class (TObject)
Name: string;
Params: TStrings;
Text: TStrings;
Lexems: TLexemsArray;
Clauses: array of TPredicateClause;
constructor Create;
destructor Destroy; override;
end;
TFileOpenMode = (fomRead, fomWrite, fomNotOpened);
TPrologFile = class (TObject)
Name: string;
HandlerNumb: integer;
OpenMode: TFileOpenMode;
FileVar: TextFile;
constructor Create;
destructor Destroy; override;
procedure OpenRead (FileName: string);
procedure OpenWrite (FileName: string);
procedure Close;
function EndOfFile: Boolean;
procedure ReadFile (var st: string);
procedure WriteFile (st: string);
end;
TVariableSize = record
Name: string;
iType: TPrologVariablesTypes;
size: integer;
end;
const
SimplePrologTypesCount = 4;
SimplePrologTypes: set of TPrologVariablesTypes =
[VtString, vtInteger, vtBoolean, vtReal];
PrologVariablesSizes: array [0 .. 5] of TVariableSize =
((Name: 'STRING'; iType: vtString; Size: SizeOf (string)),
(Name: 'INTEGER'; iType: vtInteger; Size: SizeOf (integer)),
(Name: 'BOOLEAN'; iType: vtBoolean; Size: SizeOf (Boolean)),
(Name: 'REAL'; iType: vtReal; Size: SizeOf (Extended)),
(Name: 'LIST'; iType: vtList; Size: SizeOf (TPrologVariableList)),
(Name: 'STRUCT'; iType: vtStruct; Size: SizeOf (TPrologVariableStruct)));

Додаток 3

Інтерфейсна частина модуля з функціями і предикатами інтерпретатора.
unit PrologRunTime;
interface
Uses SysUtils, CompileUnit, ProgramClasses, CommonFunctions;
type
TErrorCode = (ecType, ecNo, ecOverflow, ecDivideZero, ecExdivssionValue,
ecArgsCount, ecArgType, ecTan, ecRealAsInteger, ecTypeInExtData,
ecListTail, ecPredicateParams, ecExtDataAbsent, ecExtDataDelete,
ecRangeError, ecConvertError, ecFileOpenError, ecFileCloseError,
ecFileAccessError,
ecCloseProgram,
ecStopPrologProgram);
/ / EcType - помилка типу
/ / EcNo - немає помилок
/ / EcOverflow - переповнення
/ / EcDivideZero - поділ на нуль
/ / EcExdivssionValue - вираз повертає нелогічних значення
/ / EcArgsCount - невірне кількість аргументів у функції
/ / EcArgType - помилка типу аргументу функції
/ / EcTan - помилка виконання операції тангенса
/ / EcRealAsInteger - помилка конвертації реального числа в ціле
/ / Виникає, коли функції потрібно ціле число, а у пропонованого
/ / Аргументу функції є ненульова дрібна частина
/ / EcTypeInExtData - помилка типу при виклику бази даних
/ / EcListTail - поділ списку на голову і хвіст виявилося неуспішним
/ / EcCloseProgram - закриття програми
/ / EcStopPrologProgram - зупинка програми
/ / EcPredicateParams - неправильні предиката
TRunTimeError = class (TObject)
Code: TErrorCode;
PredicateName: string;
x, y: integer;
constructor Create;
procedure SetError (err: TErrorCode);
procedure ShowOnScreen;
end;
TOperatorFunction = function (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
TStdFunction = function (Args: TPrologVariables): TPrologVariable;
TStdPredicate = function (VarPacket: TPrologVariables; BackTracking: Boolean): Boolean;
function VariableToStr (v: TPrologVariable;
PrintName: Boolean = True; PrintCommas: Boolean = True;
SquareBrackets: boolean = True): string;
function EqualOperator (Dst: TPrologVariable;
Src: TPrologVariable): Boolean;
function OperatorEQ (
Oper1: TPrologVariable; Oper2: TPrologVariable;
Variables: TPrologVariables): TPrologVariable;

function OperatorPlus (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorMinus (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorMultiply (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorDivide (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorGT (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorLT (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorGE (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorLE (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorNotEQ (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorAND (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function OperatorOR (
Oper1: TPrologVariable; Oper2: TPrologVariable): TPrologVariable;
function StdFunctionNot (Args: TPrologVariables): TPrologVariable;
function StdFunctionSin (Args: TPrologVariables): TPrologVariable;
function StdFunctionCos (Args: TPrologVariables): TPrologVariable;
function StdFunctionTan (Args: TPrologVariables): TPrologVariable;
function StdFunctionInt (Args: TPrologVariables): TPrologVariable;
function StdFunctionFrac (Args: TPrologVariables): TPrologVariable;
function StdFunctionSubStr (Args: TPrologVariables): TPrologVariable;
function StdFunctionFindStr (Args: TPrologVariables): TPrologVariable;
function StdFunctionChr (Args: TPrologVariables): TPrologVariable;
function StdFunctionAsc (Args: TPrologVariables): TPrologVariable;
function StdFunctionExp (Args: TPrologVariables): TPrologVariable;
function StdFunctionLn (Args: TPrologVariables): TPrologVariable;
function StdFunctionNumbToStr (Args: TPrologVariables): TPrologVariable;
function StdFunctionStrToNumb (Args: TPrologVariables): TPrologVariable;
function StdFunctionAbs (Args: TPrologVariables): TPrologVariable;
function StdPWrite (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPWriteLn (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPnl (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsInteger (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsReal (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsNumeric (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsString (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsBoolean (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsList (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsStruct (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPIsFree (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPReadInt (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPReadString (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPReadReal (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPDBAppendZ (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPDBAppendA (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPDBDelete (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPDBClear (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFileOpenRead (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFileOpenWrite (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFileClose (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFileRead (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFileWrite (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPEOF (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPStringToList (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
function StdPFail (VarPacket: TPrologVariables;
BackTracking: Boolean): Boolean;
var
RunTimeError: TRuntimeError;

Додаток 4.

Текст демонстраційний програми.
DOMAINS
ListElement: Complex {}
Integer {}
Real {}
String {}
StringList {}
ParamsList: List of ListElement {Список параметрів конфігурації}
StringList: List of String {Список із запитами}
ALIAS
DBDEMOS
DATABASES
Configs: 'Configs.DB' {}
Task: String [33] {}
Frequency: Integer [4] {}
Processor: String [17] {}
Memory: Integer [4] {}
VideoMemory: Integer [4] {}
HDD: Integer [4] {}
MonitorSize: Integer [4] {}
Addition1Name: String [17] {}
Addition1Value: String [9] {}
Addition2Name: String [17] {}
Addition2Value: String [9] {}
Addition3Name: String [17] {}
Addition3Value: String [9] {}
Addition4Name: String [17] {}
Addition4Value: String [9] {}
DeviceClass: 'DeviceClass.db' {}
TypeName: String [17] {}
SubType: String [33] {}
SubTypeIndex: Real {}
PREDICATES
_ReadParameters {Допоміжний до ReadParameters}
String {Елемент списку}
StringList {Вхідний список}
StringList {Вихідний список}
AddElementToStringList {Додає елемент до списку}
String {Елемент}
StringList {Вхідний список}
StringList {Вихідний список}
AddNewAddition {Додати до списку додаткових пристроїв}
StringList {список імен доп. уст-в}
StringList {список типів доп. уст-в}
String {нове ім'я доп. уст-ва}
String {новий тип доп. уст-ва}
StringList {вих. список імен доп. уст-в}
StringList {вих. список типів доп. уст-в}
ChooseConfig {вибір конфігурації}
StringList {список із запитами}
ParamsList {Вхідний список з параметрами}
ParamsList {Вихідний список з параметрами}
GetListElement {Видає за номером елемент списку}
ParamsList {Список, в якому шукається елемент}
Integer {Номер шуканого елемента}
Integer {Поточний лічильник}
ListElement {Значення, що повертається}
Max {Вибирає максимальне значення}
ListElement {Значення 1}
ListElement {Значення 2}
ListElement {повертається значення}
PrintAdditions {Друк додаткових пристроїв}
StringList {Імена пристроїв}
StringList {Типи пристроїв}
ReadParameters {Читає параметри до списку}
StringList {вхідний список}
StringList {вихідний список}
run {запускається предикат}
SelectProcessor {вибір процесора}
String {Процесор 1}
Integer {Частота 1}
String {Процесор 2}
Integer {Частота 2}
String {Обраний процесор}
Integer {Обрана частота}
GOAL
run
CLAUSES
ReadParameters (InList, OutList) if
ReadString (St), nl,
_ReadParameters (St, InList, OutList).
_ReadParameters ("", InList, InList).
_ReadParameters (St, InList, OutList) if
AddElementToStringList (St, InList, InList2),
ReadParameters (InList2, OutList).
AddElementToStringList (A, T, [A | T]).
GetListElement ([H | _], N, N, H).
GetListElement ([_ | T], N, N1, K) if
N2 = N1 +1,
GetListElement (T, N, N2, K).
Max (Value1, Value2, Value1) if Value1> = Value2.
Max (Value1, Value2, Value2) if Value1 <Value2.
SelectProcessor (OldProc, OldFreq, Proc1, Freq1, Proc1, OldFreq) if
DeviceClass ("Processor", OldProc, OldProcNumb),
DeviceClass ("Processor", Proc1, Proc1Numb),
OldProcNumb = Proc1Numb,
OldFreq> = Freq1.
SelectProcessor (OldProc, OldFreq1, Proc1, Freq1, Proc1, Freq1) if
DeviceClass ("Processor", OldProc, OldProcNumb),
DeviceClass ("Processor", Proc1, Proc1Numb),
OldProcNumb = Proc1Numb,
OldFreq <Freq1.
SelectProcessor (OldProc, OldFreq, Proc1, Freq1, OldProc, OldFreq) if
DeviceClass ("Processor", OldProc, OldProcNumb),
DeviceClass ("Processor", Proc1, Proc1Numb),
OldProcNumb> Proc1Numb.
SelectProcessor (OldProc, OldFreq, Proc1, Freq1, Proc1, Freq1) if
DeviceClass ("Processor", OldProc, OldProcNumb),
DeviceClass ("Processor", Proc1, Proc1Numb),
OldProcNumb <Proc1Numb.
{CreateParamsList (Freq, Proc, Mem, VMem, HDD, Monitor, Names, Vals,
[Freq, Proc, Mem, VMem, HDD, Monitor, Names, Vals]).}
AddNewAddition (N, V ,"","", N, V).
AddNewAddition ([],[], An, Av, [An], [Av]).
AddNewAddition ([Hn | Tn], [Hv | Tv], Hn, Av, [Hn | Tn], [Hv | Tv]) if
DeviceClass (Hn, Hv, OldNumb),
DeviceClass (Hn, Av, NewNumb),
OldNumb> = NewNumb.
AddNewAddition ([Hn | Tn], [Hv | Tv], Hn, Av, [Hn | Tn], [Av | Tv]) if
DeviceClass (Hn, Hv, OldNumb),
DeviceClass (Hn, Av, NewNumb),
OldNumb <NewNumb.
AddNewAddition ([Hn | Tn], [Hv | Tv], An, Av, [Hn | NewN], [Hv | NewV]) if
AddNewAddition (Tn, Tv, An, Av, NewN, NewV).
ChooseConfig ([], InParams, InParams).
ChooseConfig ([H | T], InParams, OutParams) if
Configs (H, Freq1, Proc1, Mem1, VMem1, HDD1, Monitor1, an1, av1, an2, av2, an3, av3, an4, av4),
GetListElement (InParams, 6,0, OldAddsNames),
GetListElement (InParams, 7,0, OldAddsVals),
AddNewAddition (OldAddsNames, OldAddsVals, an1, av1, AddsNames1, AddsVals1),
AddNewAddition (AddsNames1, AddsVals1, an2, av2, AddsNames2, AddsVals2),
AddNewAddition (AddsNames2, AddsVals2, an3, av3, AddsNames3, AddsVals3),
AddNewAddition (AddsNames3, AddsVals3, an4, av4, AddsNames4, AddsVals4),
GetListElement (InParams, 5,0, OldMonitor),
Max (Monitor1, OldMonitor, NewMonitor),
GetListElement (InParams, 4,0, OldHDD),
{Max (HDD1, OldHDD, NewHDD),}
NewHDD = OldHDD + HDD1,
GetListElement (InParams, 3,0, OldVMem),
Max (VMem1, OldVMem, NewVMem),
GetListElement (InParams, 2,0, OldMem),
Max (Mem1, OldMem, NewMem),
GetListElement (InParams, 1,0, OldProc),
GetListElement (InParams, 0,0, OldFreq),
SelectProcessor (OldProc, OldFreq, Proc1, Freq1, NewProc, NewFreq),
{CreateParamsList (NewFreq, NewProc, NewMem, NewVMem, NewHDD, NewMonitor, AddsNames4, AddsVals4, InParams1),
ChooseConfig (T, InParams1, OutParams)}
ChooseConfig (T, [NewFreq, NewProc, NewMem, NewVMem, NewHDD, NewMonitor, AddsNames4, AddsVals4], OutParams).
PrintAdditions ([],[]).
PrintAdditions ([Hn | Tn], [Hv | Tv]) if
Write (Hn), Write (""), WriteLn (Hv),
PrintAdditions (Tn, Tv).
run if
{ReadParameters ([], A),
WriteLn (A),}
ChooseConfig (["Internet", "твір музики", "Delphi 3"], [0, "86", 0,0,0,0 ,[],[]], B),
{WriteLn (B),}
GetListElement (B, 0,0, Freq),
GetListElement (B, 1,0, Proc),
WriteLn ("Процесор:", Proc, "", Freq, "MHz"),
GetListElement (B, 2,0, Mem),
WriteLn ("Пам'ять:", Mem, "МБайт"),
GetListElement (B, 3,0, VMem),
WriteLn ("Відео пам'ять:", VMem, "МБайт"),
GetListElement (B, 4,0, HDD),
WriteLn ("Вінчестер:", HDD, "МБайт"),
GetListElement (B, 5,0, Monitor),
WriteLn ("Монітор:", Monitor ,""""),
GetListElement (B, 6,0, Names),
GetListElement (B, 7,0, Vals),
PrintAdditions (Names, Vals).
Система містить інтегровану середу розробника, яка надає широкі можливості по візуальному вводу, редагування та налагодження програми на Пролозі.

1 Дослідницька частина

1.1 Роль реляційних мов у розвитку обчислювальної

техніки

В даний час зростає коло практичних систем, що використовують досягнення штучного інтелекту на сучасних ЕОМ, з'явилися престижні проекти створення ЕОМ нових поколінь, в яких інтелектуальний інтерфейс з кінцевим користувачем (непрофесіоналом в інформатиці) є центральним елементом. У японському проекті створення ЕОМ п'ятого покоління мова Пролог прямо називається базовою мовою програмування [5].
Близькість Прологу до кінцевого користувача пояснюється тим, що він є декларативною мовою. Щоб задати певну послідовність дій, що призводять до вирішення завдання, у програмі на Пролозі необхідно описати її зміст в термінах об'єктів і відносин між ними. Таким чином, замість алгоритму розв'язання задачі, програміст складає її логічну специфікацію.
Що ж стосується побудови алгоритму, то це автоматично виконується самою Пролог-системою за допомогою вбудованого механізму виведення. При цьому мета виконання завдання представляється у вигляді запиту до бази знань, в якій міститься опис предметної області завдання. Для пошуку в базі даних значень, необхідних у запиті, Пролог-система ініціює механізм виведення. Таким чином, обчислення в Пролозі являють собою процес дедукції, спрямований на побудову докази цільового затвердження завдання. [1]
Семантика мови Пролог значно відрізняється від семантики інших мов програмування. Взагалі, мови програмування можна розбити на три широкі категорії у відповідності з природою семантики цих мов:
· Процедурні мови;
· Функціональні мови;
· Реляційні мови.
Сенс конструкції процедурного мови визначається в термінах поведінки комп'ютера при виконанні цієї конструкції. У функціональному мовою сенс конструкції (наприклад, виклик функції) визначається в термінах значення, яке вона виробляє. А в реляційному мовою - відношення між окремими сутностями або класами сутностей. Таким чином, процедурні мови можна назвати мовами низького рівня, тому що вони дають картину світу, близьку до погляду на світ з позицій комп'ютера. Мови ж високого рівня забезпечують погляд на світ, що наближається до картини світу, представленої в специфікації завдання. При використанні ідеального реляційного мови стає можливим написання програми, структурно ізоморфної по відношенню до своєї специфікації, тобто для кожної варіації форми специфікації буде існувати відповідна варіація форми програми.
Хоча Пролог і далекий від ідеального реляційного мови, він у той же час досить близький до такого мови. Це дозволяє програмісту скористатися згаданими вище перевагами ідеальних реляційних мов. Програміст може мислити в термінах структури відносин, не піклуючись про точність їх трансляції в програму. Тобто даний мова дозволяє працювати фахівцю на високому концептуальному рівні. [1]
Можливі три точки зору програміста на Пролог-програму.
1. Реляційний підхід. При цьому програма розглядається як безліч взаємовизначення, можливо дуже складних, взаємин. Реляційний підхід придатний у тому випадку, коли добре відома структура предметної області. Процес програмування при цьому зводиться до аксіоматичному визначення кожного відносини. Вхідний і вихідний потоки, а також поведінка програми є результатами дії запитів до відношення. Якщо відношення реалізовано коректно, то будуть правильними також вхідний і вихідний потоки.
2. Підхід до програми з позицій потоку даних. Такий погляд на програму доречний, коли відома природа вихідного потоку (тобто безліч відповідей). При програмуванні реалізується така внутрішня структура програми, яка створює бажаний вихідний потік. Якщо важливий порядок проходження відповідей у ​​вихідному потоці, то при побудові програми слід в явній формі враховувати процедурні фактори.
3. Поведінковий підхід до програми. Поведінковий підхід придатний тоді, коли відомо лише бажане поведінку програми. Процес програмування пов'язаний з побудовою такої внутрішньої структури програми, яка забезпечить задану поведінку. При розробці такої програми слід обов'язково враховувати процедурні фактори і вплив побічних ефектів.
Ці три підходи не є взаємовиключними, вони являють собою різні способи мислення в процесі програмування. З точки зору стилю програмування рекомендується застосовувати або реляційний підхід, або підхід до програми з позицій потоку даних, а до поведінкового слід вдаватися лише в разі крайньої необхідності. Причина полягає в тому, що програми, при складанні яких застосовувався поведінковий підхід, майже завжди важко читати, супроводжувати і перекладати з однієї версії Пролог на іншу.

1.2 Основні механізми дедукції

Існують два методи логічного висновку, звані прямий ланцюжком міркувань і зворотного ланцюжком.
Пряма ланцюжок міркувань передбачає використання правил для логічного висновку нових фактів, а також фактів, які імпліцитно існували раніше, але можуть бути зроблені явними допомогою застосування правил. Тобто механізм виведення працює для поповнення початкового запасу істинних фактів фактами, які маються на увазі за допомогою набору правил. Подібна пряма ланцюжок міркувань на практиці не застосовується: у системі з реальним числом правил є так багато що маються на увазі (прихованих) фактів, що, будучи виявлені, вони затьмарять ті кілька фактів, які дійсно представляють інтерес і є корисними.
Проте системи, засновані на прямій ланцюжку міркувань, існують. Будь-яка така система має додатковий механізм (іноді вельми специфічний залежно від проблеми) для того, щоб визначити, з яким наступним правил їй належить працювати. Замість простого циклу, який механічно вибирає правила, механізм вибору чітко встановлює пріоритет вибору тих чи інших фактів і правил.
Розглянемо тепер інший спосіб отримання логічного висновку на основі фактів і правил. Почнемо з висновку, який представляє для нас інтерес і не є явним істинним фактом. Воно не знаходиться серед збережених фактів, коли ми запускаємо систему.
Механізм виведення переглядає всі правила, які призводять до даного факту як до ув'язнення. Потім механізм переглядає посилки цих правил. Можливо, вони вже зберігаються серед справжніх фактів. Тоді можна вважати, що вивчаються факт є істинним і повинен бути доданий у сховище істинних фактів. Якщо ні одне з правил не може бути використане для безпосереднього визначення розглянутого значення через те, що необхідно встановити істинність їх посилок, то в такому випадку необхідно йти в зворотному напрямку і спробувати встановити достовірність усіх посилок у тих правилах, які можуть застосовуватися для встановлення істинності кінцевого висновку. Переміщення на багато рівнів тому в деревоподібної структурі дасть нам факти, які є істинними. Це і є зворотний ланцюжок міркувань.
Механізм виведення на Пролозі заснований на зворотному ланцюжку міркувань. Процес виконання програми зводиться до встановлення істинності певної пропозиції в Пролозі (і зазвичай у визначенні величин певних змінних в процесі) за допомогою зворотного ланцюжка міркувань і триває до тих пір, поки не будуть знайдені деякі базові істинні факти, відомі системі. [3]

1.3 Обчислення предикатів як мову для вирішення завдань

Для автоматичного аналізу міркувань необхідний певний формальний мова, на якому можна формувати посилки і робити вірні висновки. Все, що для цього потрібно, - це можливість описати цікавить нас завдання і засоби пошуку відповідних кроків у процесі логічного висновку.
Обчислення предикатів першого порядку - це така система в логіці, в якій можна висловити велику частину того, що відноситься до математики, а також з розмовної мови. Ця система містить правила логічного висновку, що дозволяють робити вірні логічні побудови нових тверджень. Завдяки своїй спільності і логічної силі числення предикатів може всерйоз претендувати на використання його для машинного побудови умовиводів.
Мова, подібний мови в численні предикатів, визначається його синтаксисом. Щоб задати синтаксис, треба задати алфавіт символів, які будуть використовуватися в цій мові. Один з важливих класів виразів в численні предикатів - це клас правильно побудованих формул.
Ми зазвичай користуємося мовою для того, щоб робити твердження, що стосуються нас цікавить області. Відносини між мовою і описуваної їм областю визначається семантикою цієї мови. Правильно побудовані формули обчислення предикатів якраз є тими висловлюваннями, які ми будемо використовувати в якості тверджень, що стосуються нас цікавить області. Кажуть, що правильно побудовані формули приймають значення T або F в залежності від того, є ці зроблені у цій сфері істинними або помилковими. Прийоми поводження з правильно побудованими формулами дозволяють будувати умовиводи, пов'язані з деякої області, і, отже, можуть представити інтерес при створенні прийняття рішення, що вимагає такого умовиводу. [2]

1.3.1 Уніфікація і принцип резольвенціі в обчисленні

предикатів

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

Позначимо через окремий випадок літерала P, що виходить при використанні підстановки . Наприклад, . Композицією двох підстановок і називається результат застосування до термів підстановки з наступним додаванням пар з , Що містять змінні, що не входять до числа змінних з . Можна показати, що застосування до літерали P послідовно підстановок і дає той же результат, що і застосування підстановки , Тобто . Можна також показати, що композиція підстановок асоціативна: . Якщо підстановка застосовується до кожного елементу безлічі літералів, то безліч відповідних їй приватних випадків позначається через . Безліч літералів називається уніфіціруемим, якщо існує така підстановка , Що . У цьому випадку підстановку називають уніфікатором , Оскільки її застосування стискає безліч до одного елемента. Найбільш загальним (або найпростішим) уніфікатором для буде такою уніфікатор , Що якщо - Будь-який уніфікатор для , Що дає , То знайдеться підстановка , Для якої .
Існує алгоритм, званий алгоритмом уніфікації, який призводить до найбільш загальному уніфікатору для уніфіціруемого безлічі літералів і повідомляє про невдачу, якщо безліч неуніфіціруемо. Алгоритм починає роботу з порожньою підстановки і крок за кроком будує найбільш загальний уніфікатор, якщо такий існує.
Нехай вихідні пропозиції задаються у вигляді і і змінні, що входять до , Не зустрічаються в і назад. Нехай і - Такі дві підмножини і , Що для об'єднання існує найбільш загальний уніфікатор . Тоді кажуть, що дві пропозиції і вирішуються, а нова пропозиція є їх резольвенту. Резольвента представляє виведене пропозицію, і процес утворення резольвенти з двох "батьківських" пропозицій називається резольвенціей.
Іншими словами ми хочемо мати можливість знаходити доказ того, що деяка правильно побудована формула W в численні предикатів логічно випливає з деякого безлічі S правильно побудованих формул. Це завдання еквівалентна задачі докази того, що безліч неудовлетворімо. Процеси виявлення неудовлетворімості деякого безлічі пропозицій називаються процесами спростування.
Принцип резольвенціі непротиворечив і повний. Несуперечність означає, що якщо коли-небудь ми прийдемо до порожнього пропозицією, то вихідна безліч зобов'язана бути неудовлетворімим. Повнота означає, що якщо вихідна безліч неудовлетворімо, то, врешті-решт, ми прийдемо до порожнього пропозиції. [2]

1.3.2 Методи пошуку докази в численні предикатів

1.3.2.1 Обчислення предикатів при вирішенні завдань

Іноді достатньо лише знати, чи слід логічно правильно побудована формула W з деякого безлічі S правильно побудованих формул. Якщо W не випливає з S, то, можливо, ми захочемо знати, слід ~ W з S. Звичайно, в силу нерозв'язності обчислення предикатів не завжди можна встановити, чи слід W з S.
В інших додатках потрібно знати значення елемента x (якщо він існує), при якому дана правильно побудована формула W (що містить x в якості змінної) логічно випливає з деякого безлічі S правильно побудованих формул. Іншими словами, ми хотіли б знати, чи слід логічно правильно побудована формула , І якщо так, то який той окремий випадок змінної x. Проблема пошуку докази правильно побудованої формули , Виходячи з S, є звичайною проблемою докази в численні предикатів, але для побудови задовольняє окремого випадку потрібно, щоб метод доказу був "конструктивним".
Часто твердження, що відносяться до задачі, робляться у формі фраз на розмовному мовою, наприклад англійською. Тому природно виникає питання, в яких випадках можна здійснити автоматичний переклад з англійської мови на мову числення предикатів. Написано кілька програм, що дозволяють в обмежених рамках переклад з природної мови на мову предикатів, але здатність працювати з природною мовою поки що перебуває у вельми незадовільному стані. [1]

1.3.2.2 Стратегії перебору

Безпосереднє застосування принципу резольвенціі відповідає простий процедурою повного перебору при побудові спростування. Такий перебір ми починається множини S, до якого додається резольвенти всіх пар пропозицій в S з тим, щоб утворити безліч R. Потім додаються резольвенти всіх пар пропозицій в R з тим, щоб утворити безліч R (R (S)) = R 2 (S), і т.д. Цей метод перебору як правило непридатний для практики, так як багатьох R (S), R 2 (S), ... надто швидко розростаються. Практичні процедури докази визначаються стратегіями перебору, що застосовуються для його прискорення. Такі стратегії бувають трьох типів: стратегії спрощення, стратегії очищення і стратегії упорядкування. [2]

1.3.2.3 Стратегії спрощення

Іноді безліч пропозицій вдається спростити, виключивши з нього деякі пропозиції або виключивши з пропозицій певні літерали. Ці спрощення такі, що спрощене безліч пропозицій здійснимо тоді і тільки тоді, коли здійснимо вихідна безліч пропозицій. Таким чином, застосування стратегій спрощення дозволяє знизити швидкість росту нових пропозицій.
Виняток тавтологію.
Будь-яка пропозиція, що містить літерал і його доповнення (таку пропозицію називається тавтологією), можна відкинути, тому що будь-нездійсненне безліч, що містить тавтологію, залишається нездійсненним і після її видалення.
Виняток шляхом означування предикатів.
Іноді з'являється можливість означити (з'ясувати значення істинності) літери, та це виявляється зручніше, ніж включати відповідні пропозиції у S. Таке означивание легко провести для константних окремих випадків. Наприклад, якщо предикатна буква E позначає відношення рівності, то означивание константних приватних випадків типу E (7,3), коли вони з'являються, провести легко, хоча нам би не хотілося додавати до S повну таблицю, що містять багато константних приватних випадків літералів E (x , y) і ~ E (x, y).
Якщо який-небудь літерал пропозиції отримує значення істинності T, то всі пропозиції можна відкинути, не порушуючи при цьому властивості нездійсненності залишився множини. Якщо ж який-небудь літерал при означиванія отримує значення істинності F, то з цієї пропозиції можна виключити дане входження літерала. [2]
Виняток подслучаев.
Пропозиція називається подслучаем пропозиції , Якщо існує така підстановка , Що . Наприклад,
- Подслучай пропозиції ,
- Подслучай пропозиції ,
- Подслучай пропозиції
- Подслучай пропозиції .
Пропозиція в S, що є подслучаем іншої пропозиції в S, можна виключити з S, не порушуючи властивості нездійсненності залишився множини. Відкидання пропозицій, які є подслучаямі інших, часто веде до значного зменшення числа резольвенцій, необхідних для знаходження докази. [2]

1.3.2.4 Стратегії очищення

Стратегії очищення засновані на тих теоретичних результатах в теорії докази за допомогою резольвенцій, в яких стверджується, що для знаходження спростування не потрібні всі резольвенціі. Іншими словами, досить виконати резольвенціі тільки для пропозицій, які відповідають певним вимогам. Позначимо через об'єднання множини S і безлічі всіх резольвент всіх пар пропозицій з S, що задовольняють критерію C. Ясно, що .
Про стратегію очищення, що використовує критерій C, говорять, що в ній використовується "резольвенція по відношенню до C". Для застосування такої стратегії спочатку обчислюється , Потім і т.д. до тих пір, поки при деякому n в не виявиться порожнього пропозиції обозначемого nil.
Потенційне гідність стратегії очищення, в тому, що на кожному рівні потрібно менше резольвенцій. Проте рівень, на якому з'являється пусте пропозицію, зазвичай зростає, так що стратегія очищення приводить звичайно до вузькоспрямованому, але більш глибокому перебору. Стратегія очищення корисна лише в тому випадку, якщо вона зменшує всі витрати зусиль на перебір, включаючи зусилля, необхідні для перевірки критерію C. [2]

1.3.2.5 Форми докази з відфільтровування

попередніх вершин

Доказ із відфільтровування попередніх вершин виробляється з використанням AF-графа. Граф спростування має AF-форму, якщо кожна з його вершин відповідає одному з таких пропозицій:
1. базового пропозицією;
2. пропозицією, безпосередньо наступного за базовим;
3. пропозицією, безпосередньо наступного за двома небазовими пропозиціями A і B, з яких B передує A (звідси термін відфільтровування попередніх вершин).
Граф у вигляді лози являє собою окремий випадок графа в AF-формі: кожна з його вершин відповідає або пропозицією 1, або пропозицією 2. Але граф типу лози існує не для всіх неудовлетворімих множин. Нижче наведено приклад такого графа. [2]

Рис 1.1. Вид графа в AF-формі.

1.3.2.6 Стратегії підтримує безлічі

Стратегією підтримує безлічі називають стратегію, в якій вибирається таке непорожнє безліч K вихідного безлічі пропозицій S, що безліч SK удовлетворімо. Наприклад, в якості K можна взяти безліч пропозицій, що виникають із заперечення доводити теореми. Кажуть, що пропозиції в K мають підтримку. При пошуку спростування допустимими вважаються резольвенти лише тих пар пропозицій, в яких, принаймні, одне має підтримку, кожної пропозиції, побудованому в результаті резольвенціі, також надається підтримка.
Так як безліч SK удовлетворімо, існує граф спростування, має AF-форму, у якого верхній вершиною служить один з елементів множини K. Таким чином, стратегія підтримує безлічі повна, оскільки вона допускає всі резольвенціі, що допускаються AF-стратегією. [2]

1.3.2.7 Стратегії впорядкування

На основі резольвенцій, забезпечуваних різними стратегіями очищення, іноді можна шукати спростування, упорядкувавши виконуються резольвенціі. У стратегіях впорядкування не забороняються ніякі типи резольвенцій, а лише даються вказівки на те, які з них треба виконувати в першу чергу. Стратегії впорядкування відповідають магічними стратегіям перебору для пошуку на графах. При хорошому впорядкування не обов'язково обчислювати всі елементи множин R (S), R 2 (S) і т.д. Якщо пусте пропозицію з'являється вперше на рівні n, що хочеться думати, можна прямо направити на цей рівень, не заповнюючи нижні рівні.
Дві досить ефективні стратегії упорядкування - це стратегія переваги одночленная і стратегія найменшого числа компонент. У стратегії переваги одночленная робиться спроба спочатку побудувати резольвенти між одночленним, тобто пропозиціями, що містять один літерал. Якщо це вдається, то відразу ж виходить спростування. Якщо ж не можуть знайти пару одночленним, у яких є резольвента, то намагаються знайти резольвенту для пар Одночлен-двочлен і т.д. Як тільки якась пара пропозицій дозволяється, отриману резольвенту відразу зіставляють з одночленним з тим, щоб знайти можливі резольвенти. Щоб уникнути вчинення невигідною ланцюжка одночленним резольвенцій зазвичай встановлюється граничний рівень.
Стратегія переваги одночленная виправдана гарантованим укороченням довжини пропозицій, що викликається одночленним резольвента. Так як мета побудови резольвент складається в освіті порожнього пропозиції, то стратегія переваги одночленная напрошується сама собою. При введенні граничних рівнів для можливості використання та інших резольвенцій така стратегія не перешкоджає знаходженню спростування і, як правило, сильно прискорює процес перебору.
Стратегія найменшого числа компонент впорядковує резольвенціі згідно довжині одержуваних резольвент. Так, дві пропозиції, що дають найбільш коротку резольвенту, вирішуються в першу чергу. Ця стратегія в деякому сенсі дорожче, оскільки до виконання резольвенціі треба підрахувати довжини потенційних резольвент і впорядкувати їх. [2]

1.4 Аналіз характеристик існуючих інтерпретаторів

В даний час існує декілька інтерпретаторів і компіляторів мови Пролог.
СіПролог (CProlog). Постачальником є ​​відділ архітектури Університету Едінбургу. Ця версія переноситься практично на будь-який 32-розрядний комп'ютер з операційною системою UNIX. Синтаксис СіПролога збігається із синтаксисом DEC-10 Прологу. Вбудованого редактора не існує. У отладчика є всього чотири команди:
Call - виклик першої фрази предиката
Back To - виклик другої і наступних фраз
Exit - процедура виконана успішно
Fail - система досягла кінця безлічі фраз. [2]
Квінтус Пролог (Quintus Prolog). Поставляється фірмою Quintus Computer Systems Inc. Він Призначений для ЕОМ під управлінням UNIX і VMS. Квінтус Пролог можна запускати або як самостійний процес, або через спеціальний інтерфейс з редактором EMACS. Відладчик аналогічний відладчику СіПролога, але має велику кількість команд. [2]
Пролог-2. Поставляється фірмою Expert Systems Int. Працює під управлінням MS-DOS. Підтримує свій механізм віртуальної пам'яті, що дозволяє писати програми, що працюють з великою кількістю даних. Через особливого механізму віртуальної пам'яті програму необхідно розбивати на модулі та вказувати явно, чи повинен знаходиться модуль у реальному пам'яті чи можливо його розміщення у віртуальному. Є вбудований редактор. Відладчик аналогічний відладчику СіПролога. [2]
Еріта Пролог (Arity Prolog). Постачальник Arity Corp. Працює під управлінням MS-DOS або сумісної операційної системи. Має механізм віртуальної пам'яті з сторінкової організацією. Вбудованого редактора немає, відладчик аналогічний попереднім. [2]
Турбо Пролог (Turbo Prolog). Постачальник Borland Int. Працює під управлінням MS-DOS. Є повноцінним компілятором, внаслідок чого має суворим контролем типів. Створений власний віконний інтерфейс з чотирма вікнами: редактор, відладчик, консоль і вікно повідомлень про помилки. Повідомлення отладчика аналогічні повідомленнями отладчика СіПролога. [6]
Visual Prolog. Постачальник Prolog Development Center. Працює під управлінням Windows 3.1 і вище. Володіє розвиненим віконним інтерфейсом. Дозволяє створювати повноцінні додатки для Windows з використанням вікон. Повідомлення отладчика аналогічні СіПролог.
Основним недоліком усіх розглянутих діалектів мови Пролог є те, що база даних у них повинна зберігатися в оперативній пам'яті, або у віртуальній, коли реальні бази даних можуть займати десятки і сотні мегабайт. Другим недоліком є ​​те що, ні один з діалектів не підтримує сучасні бази даних, а підключає бази даних, що містяться в текстових файлах і представляють собою, по суті, частина Пролог-програми.

1.5 Необхідність розробки інтерпретатора мови Пролог

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

1.6 Вибір мови програмування

На вибір мови програмування впливають такі фактори:
1. характер розв'язуваної задачі;
2. наявні системні бібліотеки;
3. поддрежіваемие компілятором платформи.
За характером розв'язуваної задачі, для програмування інтерпретатора потрібно мова програмування, що дозволяє:
1. гнучко працювати з динамічно виділяється пам'яттю;
2. мати об'єктно-орієнтоване розширення;
3. мати засоби обробки виняткових ситуацій;
4. отримувати високошвидкісний код.
Зазначеним вимогам задовольняють С + + і Паскаль. До недавнього часу Паскаль (і його діалект Delphi) значно поступався С + + по можливості формування високошвидкісного коду. Але тепер в компілятор Delphi 4 був вбудований оптимізатор, який дозволяє формувати високошвидкісний код.
Також на користь Delphi 4 говорить і те, що він тепер може оперувати з динамічними масивами, тобто з такими масивами, кількість елементів яких може змінюватися в процесі виконання програми.
Borland Delphi 4 генерує код для операційних систем Windows 95, 98 і NT. Має засоби візуальної побудови додатків.

2 Конструкторська частина

2.1 Синтаксис програм на Пролозі в нотації Бекуса-Наура

Програма:: = пропозицію <пропозиція>
Пропозиція:: = твердження, керуюча команда
Твердження:: = голова.проб_сімвол
Голова: - хвост.проб_сімвол
Голова if хвост.проб_сімвол
Керуюча команда:: =
цільове твердження
<, Цільове твердження>. Проб_сімвол
Голова:: = цільове твердження
Хвіст:: = цільове твердження
<, Цільове твердження>
Цільове твердження:: = атом | структура
Проб_сімвол:: = пробіл, повернення каретки [6]

2.2 Загальна структура інтерпретатора

Інтерпретатор мови Пролог складається з наступних частин:
· Предкомпілятор;
· Інтерпретатор.
Предкомпілятор виконує переклад вихідних даних в об'єкти інтерпретатора. Вихідними даними для предкомпілятора є:
· Текст програми;
· Типи користувача;
· Опис зовнішніх даних (структур баз даних);
· Опис предикатів програми.
Інтерпретатор на основі виконаних предкомпілятором дій та створених ним об'єктів виконує програму за допомогою алгоритму бектрекінга.

2.2.1 Принцип роботи предкомпілятора

Предкомпілятор складається з двох основних частин:
· Лексичний аналізатор
· Синтаксичний аналізатор.
Лексичний аналізатор виконує розбір тексту програми на лексеми. У ході роботи лексичного аналізатора формується масив лексем, відповідних програмі.
Синтаксичний аналізатор на основі масиву лексем, отриманих від лексичного аналізатора, формує об'єкт програми.

2.2.1.1 Робота лексичного аналізатора

Для зручності роботи лексичний аналізатор склеює весь текст програми в одну довгу рядок. Таке склеювання можна проводити, тому що максимальна довжина рядка в Delphi 4 дорівнює 2 гігабайти. При склеюванні рядків, в кінці кожного рядка ставиться пара символів Enter і пробіл. Це робиться для того, щоб зручно можна було обчислити положення лексеми в тексті програми.
Лексичний аналізатор переглядає текст програми символ за символом, пропускаючи символи, укладені між фігурними дужками. У ході перегляду аналізатор виділяє ланцюжок символів, яка схожа на лексему, після чого передає управління аналізатору лексем.
Аналізатор лексем, отримавши рядок з передбачуваної лексемою, намагається спочатку зіставити її зі стандартними лексемами (арифметичні знаки, крапка, кома і т.п.). Якщо рядок не є стандартною лексемою, то далі аналізатор лексем намагається знайти її серед предикатів, функцій і баз даних. У разі невдачі аналізатор перевіряється рядок, чи є вона правильним ідентифікатором. Якщо так, то це змінна. Якщо лексема починається і закінчується лапками, то це рядок. На заключному етапі перевіряється, чи може лексема бути числом.
Якщо ні одна з умов не було виконано, то видається повідомлення про помилку.
На виході аналізатора лексем формується об'єкт лексеми, в якому зберігається тип лексеми, її послідовну форму, а також положення лексеми в тексті програми.
Потім з отриманих лексем створюється масив.

2.2.1.2 Синтаксичний аналізатор

На початковому етапі масив лексем розбивається на кілька подмассивов по одному для кожного предиката. При розбитті масиву перевіряється таке правило: кожна пропозиція починається з імені предиката і закінчується крапкою. Таким чином, виділяються лексеми відповідні кожному предикату.
Потім робота продовжується з кожним з подмассивов окремо. Користуючись вищеописаним правилом, виділяється окрема пропозиція і відправляється на синтаксичний аналіз.
Пропозиція в Пролозі має наступний формат:
ІмяПредіката (параметр1, параметр2, ...) if
Условіе1 (Параметр11, Параметр12, ...),
Условіе2 (Пераметр21, Параметр22, ...),
УсловіеN (ПараметрN1, ПараметрN2, ...).
При синтаксичному аналізі, по-перше, перевіряється заголовок пропозиції. Перевіряється ім'я предиката і параметри (їх кількість і тип) та наявність слова "if". Якщо в якості параметра варто мінлива, то вважається, що змінна може бути будь-якого типу, а константи піддаються жорсткому контролю.
З масиву лексем пропозиції виділяються окремі умови. У цьому випадку повинні бути виконані наступні вимоги:
· Усі умови розділені комами один від одного;
· Ланцюжок умов закінчується крапкою;
· Всередині умови все дужки (круглі і квадратні) повинні бути закриті.
Перевірка умов ділиться на три частини залежно від типу першої лексеми:
· Виклик предиката, якщо перша лексема - ім'я предиката;
· Виклик бази даних, якщо перша лексема - ім'я бази даних;
· Обчислення арифметичного виразу - в усіх інших випадках.
При синтаксичному аналізі викликів предикатів і баз даних виконується розбір параметрів приблизно такий же, як при аналізі заголовка пропозиції.
При аналізі арифметичного виразу будується дерево, відповідне висловом.

2.2.1.3 Аналіз арифметичного вираження

Якщо на вхід надходить масив з одного елемента, то негайно формується лист арифметичного дерева, і програма виходить з функції.
Серед усього масиву лексем перебуває оператор з найнижчими пріоритетом, причому операції, які знаходяться всередині дужок у розгляд не беруться. У Пролозі пріоритети операцій розподілені наступним чином:
1. *, /
2. +, -
3. >,<.>=,<=,<>
4. and, or
5. =
Якщо операція не знайдена і перша і остання лексема - парні круглі дужки, то необхідно їх зняти і викликати знову функцію побудови арифметичного дерева. Можливий інший варіант при відсутності знайденої операції: перша лексема - функція, друга - відкриває кругла дужка, остання - закриває кругла дужка. У цьому випадку необхідно запустити процедуру знаходження параметрів функції.
Після того, як знайшли потрібну операцію, масив ділиться на дві частини - ліву і праву. Якщо лівий або правий масив порожній, то повідомити про помилку.
У ході виконання наступних дій ми з арифметичного вираження отримуємо дерево.
Наприклад: A = 5 + func (6 + C, D, E) / E-4

Рис 2.1. Дерево арифметичного виразу.

2.2.1.4 Аналіз параметрів предикатів

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

2.2.1.5 Перевірка типів параметрів

На вхід надходить об'єкт з параметром і ім'я типу, з яким порівнюється параметр. На виході ми повинні видати логічне значення, що говорить чи може параметр хоча б теоретично ставитися до сравниваемом типу.
Якщо параметром є змінна, то вважається, що вона може бути будь-якого типу. Числові, рядкові та логічні константи можуть бути впізнані відразу.
Складніша справа із структурами і списками, а також аналізом складових типів.
При аналізі складеного типу необхідно з'ясувати, чи належить параметр до одного з типів складеного типу. Якщо так, значить необхідно повернути істину.
Розглядаючи структуру, ми повинні перевірити тип кожного з елементів, що становлять структуру. Якщо всі елементи мають правильні типи, то повернути істину.
Список може бути записаний двома способами:
1. [Елемент1, Елемент2, ..., ЕлементN]
2. [Голова | Хвіст]
У першому випадку ми повинні перевірити тип кожного з елементів.
При розгляді другого випадку необхідно враховувати те, що Голова має тип елемента списку, а Хвіст - тип списку.

2.3 Робота інтерпретатора

Функція роботи інтерпретатора являє собою рекурсивну функцію, що виконує алгоритм бектрекінга.
Алгоритм бектрекінга полягає в наступному. Для першого оператора Пролог-програми інтерпретатор знаходить рішення, що задовольняє цього оператора. Якщо рішення було знайдено, то переходимо до наступного оператора. На другому операторі, з урахуванням результатів на попередньому кроці, програма намагається рішення для другого оператора. Якщо рішення було знайдено, то програма йде далі. В іншому випадку, програма повинна повернутися на крок назад і підібрати інше рішення для першої умови, а потім знову спробувати виконати другу умову. Такий процес триває до тих пір, поки не буде виконано остання умова, і пропозиція буде оголошено істинним. Або, якщо програма не зможе більше підібрати рішення для першої умови, то все пропозиція буде оголошено хибним.
Принцип дії інтерпретатора заснований на рекурсивному виклику функції TPrologProgram.ExecutePredicate, яка виконує предикат. На вхід функції надходить об'єкт TStackNode, в якому містяться вхідні параметри, а також номер пропозиції, з якого необхідно починати виконувати предикат. Функція ExecutePredicate повертає логічне значення, яке вказує на те, чи було знайдено рішення для предиката чи ні. Вхідні і вихідні параметри предиката зберігаються в полі InputParameters.
Послідовність дій, які виконує функція ExecutePredicate, виглядає наступним чином:
1. У кожне речення програма намагається підставити вхідні параметри. Якщо підстановка пройшла успішно (це визначається функцією FindNamedAreas), то інтерпретатор намагається виконати цю пропозицію. В іншому випадку перегляд триває.
2. Необхідно знайти рішення для кожного з умов пропозиції. Інтерпретатор проходить по кожному з умов пропозиції послідовно.
3. Перед виконанням умови перевіряється, запускається на воно на прямому шляху або на зворотному. Якщо на прямому шляху, то в додатковий стік заноситься ще один елемент TSubStackNode, в якому містяться такі дані: саме умова, список імен створених на цьому кроці змінних і список імен змінних вільних до поточного кроку. Якщо умова запускається на зворотному шляху, то об'єкт TSubStackNode не створюється, так як був створений раніше.
4. Якщо поточне умова предикат або база даних, то для них необхідно створити новий об'єкт TStackNode і сформувати пакет вхідних параметрів. Потім, якщо поточне умова база даних, то викликається функція обробки баз даних ExecuteExtDataPredicate, якщо умова стандартний предикат, то - ExecuteStandardPredicate, і, якщо це предикат користувача то рекурсивно викликається ExecutePredicate.
Якщо поточне умова - вираз, то виконується функція ExecuteArithmeticTerm.
5. Якщо після свого виконання умова повернуло значення False, то запускається механізм зворотного проходу. Знищується останній елемент TSubStackNode, і програма повертається до попереднього умові і намагається знайти нове рішення для нього.
6. Якщо всі умови були виконані, то формуються вихідні параметри і функція повертає істину. В іншому випадку, програма повертається до пункту 1 та намагається знайти ще одну пропозицію, відповідне вхідних даних.
7. Якщо були вичерпані всі пропозиції і ні для одне не було знайдено рішення, то необхідно повернути False.

2.3.1 Виконання звернень до баз даних

Звернення до бази даних відбувається за допомогою SQL-запитів.
При першому зверненні до бази даних створюється об'єкт SQL-запиту і сам запит.
Формат SQL-запиту
SELECT <Поле1>, ..., <полеN>
FROM <ім'я бази даних>
WHERE
<Поле1> = <значення1> and
<Поле2> = <значення2> and
...
<ПолеN> = <значеніеN>
У запиті використовуються тільки умови-рівності, тому що в Пролозі при зіставленні значенні на вході в предикат використовується тільки порівняння.
У список умов розміщуються лише ті поля, значення яких на вході визначені.
При першому зверненні до бази береться перший запис із запиту.
При наступних викликах бази даних (у разі зворотного шляху в бектрекінге) об'єкт SQL-запиту не створюється, а використовується раніше створений, і застосовується функція Next для доступу до наступного запису.
Таким чином, доступ до бази даних здійснюється як звичайним предикатам, які складаються тільки з пропозицій-фактів.

2.3.2 Обчислення арифметичних виразів

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

2.4 Об'єкти, використовувані компілятором і інтерпретатором

2.4.1 Об'єкти змінних TPrologVariable, TPrologVariables,

TPrologVariableList, TPrologVariableStruct

Для кончини змінних всіх типів (цілі, дробові, рядки, логічні, списки, структури) служить клас TPrologVariable. Для визначення типу змінної служить поле iType. У полі Data зберігається покажчик на дані, що відповідають типу. Для простих типів (цілі, дробові, рядки, логічні) - це покажчик на відповідний тип. Конструктор створює змінну без типу. Деструктор автоматично звільняє пам'ять для змінної будь-якого типу. Для цього класу Визначено наступні методи:
1. procedure CreateVariable (DomainType: string; vName: string) - створення змінної типу DomainType з ім'ям vName;
2. procedure DestroyVariable - знищення змінної (ця процедура не є деструкцією, так як не знищує сам об'єкт, а тільки звільняє пам'ять)
3. function CreateCopy: TPrologVariable - створення точної копії змінної;
4. procedure AssignVariable (v: TPrologVariable) - привласнення значення змінної.
Для подання списків введено клас TPrologVariableList, в якому зберігається ім'я типу списку, ім'я типу елемента списку, тип подання списку (у вигляді перерахування елементів або «голова-хвіст»), а також динамічний масив, який містить об'єкти TPrologVariable, що є елементами списку.
У структурах (TPrologVariableStruct) аналогічно зберігається ім'я типу структури, масив з типами елементів структури і динамічний масив з елементами структури.
Слід зазначити, що в класі TPrologVariable, можуть зберігатися як змінні, так і константи. У константи полі Name - порожній рядок.
Клас TPrologVariables дозволяє організувати до пакету змінних:
1. procedure AddVariable (v: TPrologVariable) - додавання змінної в список змінних;
2. function AddNewVariable: TPrologVariable - створення і додавання нової змінної в список;
3. procedure DeleteVariable (n: integer) procedure DeleteVariable (vName: string) procedure DeleteLastVariable - видалення змінної за її індексу або на ім'я, або останню змінну в списку;
4. function VariableByName (vName: string): TPrologVariable - доступ до конкретної змінної за її імені;
5. property Variables [ind: integer]: TPrologVariable - властивість, оргназіующее доступ до змінних як до масиву змінних.

2.5.2 Стандартні функції і предикати

Всі стандартні функції і предикати мають однакові параметри.
Оголошення функції виглядає наступним чином:
TStdFunction = function (Args: TPrologVariables): TPrologVariable;
Args - пакет з вхідними параметрами.
Функція повертає значення у вигляді змінної TPrologVariable.
Оголошення функції, що виконує роботу предиката:
TStdPredicate = function (VarPacket: TPrologVariables; BackTracking: Boolean): Boolean;
VarPacket - пакет з параметрами до предикату
BackTracking - логічна змінна, яка встановлена ​​в True, якщо предикат був викликаний на зворотному шляху алгоритму бектрекінга.
Функція повертає логічне значення, яке має повернути предикат після свого виконання.

2.6 Представлення Пролог-програми у вигляді об'єктів

Для зберігання скомпільованій Пролог-програми використовуються три класи TPrologTerm, TPredicateClause і TProgramPredicate.
TPrologTerm служить для зберігання однієї умови всередині пропозиції. У ньому зберігається тип умови (вираз, предикат, база даних), позиція умови в тексті Пролог-програми, а також покажчик (Data) на об'єкт представляє дана умова (TSubTermPredicate, TSubTermExtData, TSubTermExdivssion).
TSubTermPredicate служить для зберігання умов-предикатів. У цьому класі є такі поля:
1. Name: String - ім'я предиката;
2. StandardPredicate: Boolean - True - якщо предикат стандартний;
3. Params: TVariablesArray - параметри для виклику предиката;
4. NoInverse: Boolean - ознака наявності або відсутності інверсії перед викликом предиката.
TSubTermExtData аналогічний класу TSubTermPredicate за винятком того, що в ньому немає поля StandardPredicate.
TSubTermExtData призначений для подання арифметичних виразів. Він являє собою рекурсивний об'єкт з полями LeftHand і RightHand для подання виразів лівої і правої частин висловлювання. Даний клас містить такі поля:
1. Operation: TExdivssionOperation - тип операції;
2. FuncName: String - ім'я функції, якщо Operation = eoFunction;
3. Operand: TPrologVariable - змінна або константа, якщо Operation = eoVariable;
4. LeftHand: TSubTermExdivssion - ліва частина виразу;
5. RightHand: TSubTermExdivssion - права частина виразу
6. FuncParams: array of TSubTermExdivssion - параметри функції, якщо Operation = eoFunction.
TPredicateClause зберігає в собі одну пропозицію. Параметри пропозиції зберігаються в масиві Params, а умови - в Terms.
TProgramPredicate зберігає повну інформацію про предикат. Об'єкт цього класу використовується як на етапі компіляції, так і на етапі інтерпретації. Він зберігає ім'я предиката (Name), типи параметрів, текст предиката, всі лексеми предиката, а також масив з пропозиціями предиката.
Клас TPrologProgram зберігає всю інформацію про Пролог-програму:
· Опис типів (Domains);
· Опис баз даних (ExtData);
· Предикати (TProgramPredicate);
· Масив зі стеком (Stack);
· Масив з контрольними точками (BreakPoints);
· Ім'я запускається предиката (StartPredicate);
· Прапор роботи програми (OnTheRun).

2.7 Основні модулі

Модуль CompileUnit. У даному модулі визначається клас пролог-програми - TPrologProgram, а також два класи, які використовуються при запуску інтерпретатора: TStackNode і TSubStackNode. Модуль CompileUnit є ядром інтерпретатора.
Модуль ProgramClasses. У даному модулі описуються основні класи, які використовуються в об'єктах TPrologProgram, TStackNode і TSubStackNode як контейнерні:
- TLexemRecord - представляє одну лексему, виділену з тексту програми;
- TPrologVariable - представляє змінну під час виконання пролог-програми.
- TPrologVariableList - контейнерний клас, що використовується в TPrologVariable, для подання списків;
- TPrologVariableStruct - контейнерний клас, що використовується в класі TPrologVariable, для представлення структур;
- TPrologVariables - клас, що представляє собою список змінних TPrologVariable з можливістю доступу до змінної по імені;
- TSubTermPredicate - клас використовується в TPrologTerm для представлення звичайного предикатного умови в реченні;
- TSubTermExtData - клас використовується в TPrologTerm для подання предикатного умови виклику бази даних у пропозиції;
- TSubTermExdivssion - клас використовується в TPrologTerm для подання арифметичних виразів у реченні;
- TPrologTerm - клас використовує TSubTermPredicate, TSubTermExtData, TSubTermExdivssion як контейнерні для представлення однієї умови в реченні;
- TPredicateClause - використовує масив об'єкту з TPrologTerm і TPrologVariable для представлення одного речення в програмі;
- TProgramDomain - клас використовується в TPrologProgram як контейнерний для опису типів;
- TProgramExtData - клас використовується в TPrologProgram як контейнерний для опису баз даних;
- TProgramPredicate - клас використовується в TPrologProgram як контейнерний для опису предикатів;
- TPrologFile - клас використовується в TPrologProgram як контейнерний для опису файлів відкритих під час виконання програми;
Модуль PrologRunTime описує клас помилок TRunTimeError, а також всі функції і вбудовані предикати Прологу.
MainFormUnit - модуль опису головної форми TMainForm;
ProgFormUnit - модуль опису вікна інспектора TProgForm;
DomConstrFormUnit - модуль опису конструктора типів TExtDataForm;
ExtDataFormUnit - модуль опису конструктора баз даних TExtDataForm;
PredicateConstrFormUnit - модуль опису конструктора предикатів TPredicateConstrForm;
EditorFormUnit - модуль опису вікна редактора TEditorForm
ConsoleUnit - модуль опису вікна консолі TConsole;
ErrorsFormUnit - модуль опису вікна помилок компіляції TErrorsForm;
StackFormUnit - модуль опису вікна стека програми TStackForm;
RunTimeDebugFormUnit - модуль опису вікна налагодження програми TRunTimeDebugForm;
BreakPointsFormUnit - модуль опису вікна контрольних точок TBreakPointsForm;
ProjectOptionsFormUnit - модуль опису вікна опцій проекту.

2.8 Демонстраційна програма з вибору конфігурації комп'ютера

На вхід програми з клавіатури надходять завдання, які повинен буде вирішувати обираний комп'ютер. За отриманими даними програма вибирає оптимальну конфігурацію для заданого набору завдань (тип процесора, частоту процесора, об'єм оперативної пам'яті, розмір відеопам'яті, мінімальний розмір вінчестера, діагональ монітора, а також список додатковий пристроїв, таких як звукові карти, CD-ROM приводи та інше) .
У програмі використовуються дві бази даних.
База даних базових конфігурацій ("Configs.db"), в якій містяться оптимальні конфігурації для кожної з елементарних завдань.
Таблиця 2.1.
Ім'я поля
Тип поля
Коментар
Task
String [33]
Ім'я завдання
Frequency
Integer [4]
Частота процесора
Processor
String [17]
Тип процесора
Memory
Integer [4]
Розмір ОЗУ
VideoMemory
Integer [4]
Розмір відеопам'яті
HDD
Integer [4]
Розмір вінчестера
MonitorSize
Integer [4]
Діагональ монітора
Addition1Name
String [17]
Назва 1-го додаткового пристрою
Addition1Value
String [9]
Характеристика 1-го додаткового пристрою
Addition2Name
String [17]
Назва 2-го додаткового пристрою
Addition2Value
String [9]
Характеристика 2-го додаткового пристрою
Addition3Name
String [17]
Назва 3-го додаткового пристрою
Addition3Value
String [9]
Характеристика 3-го додаткового пристрою
Addition4Name
String [17]
Назва 4-го додаткового пристрою
Addition4Value
String [9]
Характеристика 4-го додаткового пристрою
База пріоритетів пристроїв ("DeviceClass.db"). Використовується для поділу пристроїв за їх характеристиками, в тому числі і процесорів.
Таблиця 2.2.
Ім'я поля
Тип поля
Коментар
TypeName
String [17]
Ім'я класу пристроїв
SubType
String [33]
Ім'я окремого пристрою
SubTypeIndex
Real
Характеристика пристрою
Внутрішнє подання конфігурації в програмі виглядає у вигляді списку, в якому перераховуються: частота процесора, тип процесора, об'єм пам'яті, обсяг відеопам'яті, розмір вінчестера, діагональ монітора, а також у двох списках однакової довжини перераховуються види і типи додаткових пристроїв.
Пара предикатів ReadParameters і _ReadParameters призначені для введення списку елементарних завдань з клавіатури в список рядків StringList.
Предикат SelectProcessor вибирає з двох вступників процесорів кращий. Якщо процесори одного класу, то рівняються частоти процесорів. Якщо процесори різних класів, то вибирається процесор з більш високим класом, навіть, якщо частота у нього і нижче.
AddNewAddition додає до списків додаткових пристроїв новий пристрій. Спочатку предикат намагається знайти пристрій серед уже відомих. Якщо воно не знайдено, то додається новий пристрій. Якщо серед вже відомих пристроїв є пристрій аналогічного типу, то з двох пристроїв вибирається пристрій з найвищим класом по базі DeviceClass.
Предикат ChooseConfig проходить за всім списком елементарних завдань, що надійшов з клавіатури, поступово вибираючи кращу конфігурацію. Обсяги оперативної пам'яті, відеопам'яті і діагональ монітора вибираються за максимальним значенням. Розмір вінчестера виходить складанням розмірів вінчестерів для кожної елементарної завдання.
Текст демонстраційної програми наведено у додатку.

3 Технологічна частина

3.1 Вимоги до експлуатації інтерпретатора мови Пролог

Програма інтерпретатора мови Пролог призначена для експлуатації на персональних обчислювальних машинах на базі процесорів сімейства Pentium і вище у мінімальній конфігурації з 16 Мб оперативної пам'яті. Для установки програми необхідно:
· У мінімальній конфігурації - 1.5 Мб дискового простору;
· В повній конфігурації (з установкою Borland Database Engine) - 10 Мб дискового простору.
В якості операційної системи може використовуватися Microsoft Windows 95, Windows 98, Windows NT.

3.2 Встановлення системи

Система поставляється на чотирьох дискетах розміром 3.5 "і об'ємом 1.44 Мб.
Установка програми здійснюється з дискет, шляхом запуску з операційної системи Windows файлу "Setup.exe", що знаходиться на першій дискеті. Далі необхідно діяти згідно з вказівками.
При установці програми необхідно вказати директорію, в яку буде проводитися інсталяція.
У процесі установки програма запитає, чи встановлювати Borland Database Engine на машину чи ні. Якщо BDE вже встановлена ​​на комп'ютер раніше, то повторна установка не потрібно.
По завершенні процесу установки програма-інталлятор створить в системному меню розділ з назвою "Prolog", а всередині нього ярлик на файл "Prolog.exe" з назвою "Prolog with databases", ярлик на help-файл і на файл "readme.txt" .

3.3 Керівництво користувача програми інтерпретатора мови

Пролог

3.3.1 Запуск програми

Запуск програми можна зробити декількома способами.
Натиснути кнопку "Пуск", вибрати в меню пункт "Програми", вибрати пункт "Prolog". Після того, як розкриється підменю, натиснути на рядок "Prolog with databases".
Двічі клацнути по іконці Прологу на робочому столі
Скористатися "провідником" або іншим менеджером файлів.

3.3.2 Перелік функцій, реалізованих системою

Програма інтерпретатора мови Пролог виконує наступні функції:
1. введення, збереження та редагування програми мовою Пролог.
2. здійснення отладочного режиму роботи з переглядом викликів предикатів і значень змінних.
3. запуск програми на виконання
4. можливість припинення працюючої програми на контрольній точці, встановленої в тексті програми, або при натисканні кнопки "Пауза".

3.3.3 Редагування Пролог-програми

Після запуску програми вся робота з написання програми може проводитися в інтегрованому середовищі розробника.
Інтегрована середовище розробника надає розробнику наступні можливості:
1. створення нового файлу програми;
2. відкриття існуючого файлу програми;
3. збереження файлу;
4. збереження файлу під новим іменем;
5. вихід з системи;
6. редагування файлу з використанням буфера обміну;
7. налаштування параметрів програми Пролог;
8. налаштування редактора;
9. запуск програми на виконання;
10. тимчасову зупинку роботи програми;
11. доступ до файлу довідки.
Всі ці можливості доступні через пункти меню або через кнопки швидкого доступу.
Після запуску програми з'являється головне вікно, на якому розміщені головне меню і основні панелі з кнопками швидкого доступу.

Рис 3.1. Вид головного вікна.
Програму необхідно у двох вікнах: у вікні редактора і у вікні інспектора.
Інспектор містить в собі основну інформацію про програму: описи типів даних, таблиць баз даних і предикатів.

Рис 3.2. Вид вікна інспектора.

Вікно інспектора розбито на три частини: "Типи", "Зовнішні дані" і "Предикати". У разі потреби розділи "Типи" і "Зовнішні дані" можна тимчасово згорнути, натиснувши на верхню кнопку відповідної панелі.
Для додавання елемента до списку типів необхідно натиснути на кнопку з зображенням плюса. Тоді праворуч від кнопки з'явиться меню для вибору типу: "Список", "Структура", "Складовою тип". Для кожного типу відкривається вікно конструктора типів, в якому можна редагувати складові елементи типів. При натисканні на кнопку "Ок" тип буде занесений в список типів. Для внесення нового елемента в тип необхідно вибрати його зі списку, ввести коментар (якщо необхідно) і натиснути на кнопку плюс на нижній панелі

а) б)
Рис. 3.3. Вид вікна конструктора типів: а) конструктор списків;
б) конструктор структур
При додаванні опису бази даних з'являється вікно для введення структури бази даних. У цьому вікні необхідно ввести ім'я бази даних у полі "Назва". Це ім'я буде використовуватися в програмі. Також необхідно ввести, або вибрати зі списку ім'я файлу бази даних. Ім'я бази даних, яке буде використовуватися в програмі, і ім'я файлу можуть відрізнятися. Для внесення поля в базу даних необхідно вибрати тип поля зі списку, ввести його довжину, а також його ім'я в базі даних і натиснути на кнопку плюс на нижній панелі. Якщо база даних вже існує, то її структуру можна ввести, натиснувши на кнопку "Поля таблиці" на нижній панелі (друга справа). Тоді з'явиться вікно, в якому буде список з полів бази даних. Можна буде вибрати ті поля, з якими буде працювати програма. При натисканні на кнопку "Ок" вибрані поля будуть внесені до списку.

Рис. 3.4. Вид вікна конструктора баз даних
Введення предиката проводиться аналогічно введенню нового типу.
Для редагування елементу будь-якого зі списків можна двічі клацнути по потрібному елементу. Для видалення елемента зі списку потрібно клацнути по ньому, а потім натиснути на кнопку мінус.
При одноразовому натисненні на елемент з ім'ям предиката текстовий курсор у вікні редактора автоматично перейде до того місця в програмі, де описується даний предикат.
Текст програми вводиться у вікні редактора. Це вікно складається з панелі інструментів і редактора. На панелі інструментів знаходиться кнопки для копіювання, вирізання та вставки фрагмента тексту, а також кнопка по установки контрольної точки в тексті. З вікна редактора можна миттєво отримати довідку про будь-якому стандартному предикаті або функції, набравши ім'я предиката або функції в тексті і натиснувши кнопку F1.


Рис. 3.5. Вид вікна редактора.
У процесі написання програми використовуються стандартні засоби редактора операційної системи Windows. Вікно редактора підтримує стандартні операції з буфером обміну Windows, що виконуються по натисканню гарячих клавіш, а також виділення областей тексту. Підтримуються наступні гарячі клавіші:
Shift - стрілки вгору, вниз, вправо, вліво, Home, End - виділення області тексту для операцій;
Ctrl-Insert або Ctrl-C - копіювати виділену область у буфер обміну;
Shift-Insert або Ctrl-V - вставити фрагмент з буфера обміну;
Shift-Del або Ctrl-X - вирізати фрагмент в буфер обміну.
Перед запуском програми у вікні опцій проекту необхідно встановити ім'я бази аліасу (якщо використовуються бази даних) і ім'я запускається предиката. Якщо не задано ім'я запускається предиката, програма не запуститься.

Рис. 3.6. Вид вікна опцій проекту.

3.3.4 Запуск програми на Пролозі і її налагодження
Для запуску програми на головному вікні треба натиснути на кнопку "Запуск" або в меню "Проект" натиснути на пункт з такою ж назвою. Після натискання на кнопку відбувається компіляція програми. У статусному рядку у головному вікні з'являється напис "Компіляція". Якщо під час були знайдені помилки, то на екран з'являється вікно з переліком знайдених помилок. При подвійному клацанні по рядку з назвою помилки текстовий курсор у вікні редактора перейде до місця в тексті, де була знайдена помилка.
Якщо процес компіляції пройшов нормально, то програма запускається на виконання. Процес виконання програми може бути перерваний натисканням на кнопки "Стоп" або "Пауза" у головному вікні, а також, якщо програма приступила до обробки оператора, на якому встановлена ​​контрольна крапка. При тимчасовій зупинці на екран з'являються два вікна: вікно трасування і вікно стека.
У вікно "Трасування" виводиться протокол роботи програми, то кожен виклик предиката, бази даних або арифметичного вираження, а також повертаються ними значення.

Рис. 3.7. Вид вікна трасування.
У вікні "Стек" можна переглянути стек програми. Стек представлений у вигляді дерева. У корені дерева знаходяться виклики предикатів. Розгорнувши кореневий елемент дерева можна побачити параметри, з якими був викликаний предикат і змінні, які були створені в процесі виконання предиката.
Загальний вигляд кореневого елемента дерева виглядає наступним чином: "Ім'я предиката n1: n2", де n1 - номер пропозиції, n2 - номер умови в реченні.

Рис.3.8. Вид вікна стека.

3.3.5 Робота з меню

Для зручності користувача при виборі команд в програму введена система меню, що містить такі пункти:
- Файл
- Вікна
- Проект
- Налаштування
- Допомога
Меню Файл містить наступні пункти.
Створити - дозволяє створити нову програму на Пролозі.
Відкрити - дозволяє відкрити наявний файл і виводить стандартне вікно Windows для відкриття файлу:


Рис.3.9. Вид вікна для відкриття файлу.
При відкритті файлу в інспектор завантажується інформація про типи, базах даних і предикатах, а в редактор - текст програми. Якщо формат файлу був порушений, то він не буде завантажений.
Згадати - за цим пунктом ховається підменю, що складається з імен останніх восьми файлів, які відкривалися Пролог-системою. Натиснувши на назву потрібного файлу в цьому підменю можна швидко завантажити його.
Зберегти - дозволяє зберегти файл на диск. Якщо файл створювався за допомогою пункту меню Створити, то виводиться діалогове вікно, що дозволяє привласнити ім'я файлу.
Зберегти як - дозволяє присвоїти нове ім'я файлу. При виборі цього пункту меню буде виведено на екран діалогове вікно для введення імені файлу.
Друк - формує друковану форму з даних, що містяться в інспектора, вікні редактора і вікні опцій проекту. Після закінчення процесу формування друкованої форми на екрані з'явиться вікно, в якому можна буде переглянути вигляд друкованої форми. У цьому вікні можна виділити область тексту і скопіювати в буфер обміну. При натисканні у вікні друку на кнопку "Друк" буде розпочато виведення на принтер. Загальний вигляд друкованої форми можна уявити наступним чином:
<Ім'я друкованого файлу>
DOMAINS
<Оголошення типів>
ALIAS
<Ім'я аліасу в Borland Database Engine, яке використовує дана програма>
DATABASES
<Опис структур баз даних>
PREDICATES
<Опис параметрів предикатів>
GOAL
<Ім'я запускається предиката>
CLAUSES
<Текст програми>
Вихід - дозволяє завершити роботу програми інтерпретатора Пролог.
Меню Вікна дозволяє відкрити наступні вікна:
Інспектор;
Консоль;
Редактор;
Контрольні точки;
Стек;
Трасування.
Меню Проект містить такі пункти:
Параметри - виводить на екран діалогове вікна з опціями проекту, в якому можна вказати ім'я аліасу, яким буде користуватися програма написана на Пролозі, а також ім'я запускається предиката.
Запуск - дозволяє запустити Пролог-програму на виконання.
Меню Налаштування містить пункт Параметри редактора. При виборі цього пункту з'являється діалогове вікно, в якому можна вибрати тип і розмір шрифту для вікна редактора.
Меню Допомога містить наступні пункти:
Предметний покажчик - завантажує help-файл і показує головну сторінку.
Про програму - виводить вікно з інформацією про програму.

3.4 Опис процесу виконання програми, написаної на

мовою Пролог

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

3.5 Загальні відомості про інтерпретаторі
Дана версія мови Пролог сумісна з синтаксису з мовою Turbo Prolog з деякими відмінностями.
Підтримуються наступні прості типи даних:
Integer - цілочисельний тип;
Real - число з плаваючою комою;
String - рядок;
Boolean - логічний тип (має два значення True - істина і False - брехня).
Складові типи:
Список - використовується для представлення масивів даних. Кількість елементів у списку не обмежена.
Структура - використовується для представлення масивів неоднорідних даних. Кількість полів у структурі не обмежена.
Складовою тип - використовується для поєднання декількох типів під одним ім'ям.
Коментарі всередині програми записуються всередині фігурних дужок.

3.6 Особливості роботи Пролог-програми з базами даних

Дана версія Прологу працює з наступними видами баз даних:
Paradox 7 (або попередні версії);
DBase IV і DBase for Windows;
Fox Pro;
MS Access.
Для використання інших видів баз даних (наприклад, InterBase або Oracle) необхідна установка драйверів цих баз даних.
Робота з базами даних проводиться під управлінням Borland Database Engine, яка повинні бути встановлена ​​на комп'ютер або при установці Прологу, або з будь-якої іншою програмою.
При виконанні програми база даних ідентифікується за допомогою свого псевдоніма, яке при введенні структури бази даних засобами інспектора заноситься в поле "Назва". Ім'я файлу бази даних у тексті програми не використовується, хоча псевдонім і ім'я файлу можуть збігатися.
Звернення до бази даних відбувається так само, як до звичайних предикатам, що складається тільки з пропозицій-фактів.
При запуску Пролог-програми інтерпретатор визначає, чи існує файл бази даних на диску. Якщо файл бази даних існує, то він відкривається і перевіряється відповідність структури файлу бази даних і опису цієї бази даних у програмі. При описі бази даних у програмі деякі поля можна не використовувати. Якщо файл бази даних відсутній на диску, то він створюється за описом структури. При завершенні виконання Пролог-програми всі бази даних автоматично закриваються.

3.7 Опис стандартних предикатів

Всі стандартні предикати виконуються тільки прямому шляху алгоритму бектрекінга. На зворотному шляху вони нічого не роблять.
Предикати введення з консолі.
ReadString (<вільна переменная>) - читає з консолі рядок. Як параметр обов'язково повинна передаватися вільна змінна. В іншому випадку буде видане повідомлення про помилку і програма закінчить свою роботу.
ReadInteger (<вільна змінна>) - читає з консолі ціле число.
ReadReal (<вільна переменная>) - читає з консолі реальне число.
Предикати виведення на консоль.
Write (<змінна або константа будь-якого типу>, ...) - друк на консоль вміст змінної. Кількість аргументів у предиката довільно. Кількість аргументів у предиката довільно. Стиль виводу на друк встановлюється в опціях проекту. Наприклад, в процесі налагодження можна включити друк імен змінних разом з їх вмістом або лапки у строкових змінних.
WriteLn (<змінна або константа будь-якого типу>, ...) - друк на консоль вміст змінної або константи і переклад курсор на наступний рядок. Кількість аргументів у предиката довільно.
Nl - переклад курсору консолі на наступний рядок.
Предикати визначення типів змінних.
IsInteger (<змінної>) - предикат є істинним, якщо надходить на вхід змінна - цілочисельна.
IsReal (<мінлива>) - перевіряє, чи є змінна реальним числом.
IsNumeric (<змінної>) - перевіряє, є чи визначена змінна числовий, тобто або реальної, або цілою. Використання функції IsNumeric краще, ніж IsInteger і IsReal, так як в ході деяких арифметичних операцій над цілими числами результат виходить дробовим (наприклад, при розподілі).
IsString (<мінлива>) - перевіряє, чи є змінна рядком.
IsBoolean (<змінної>) - перевіряє, є чи визначена змінна логічною.
IsList (<змінної>) - перевіряє, є чи визначена змінна списком.
IsStruct (<змінної>) - перевіряє, чи є змінною структурою.
IsFree (<змінної>) - перевіряє, є чи визначена змінна вільною.
Предикати для роботи з базами даних.
Предикати відкриття, закриття та створення баз даних відсутні, так як оголошені бази даних відкриваються (і створюються, якщо не були створені раніше) при запуску програми.
DBAppendZ (<ім'я бази>: String, <Поле1>, ..., <полеN>) - додає запис у кінець бази даних. Кількість полів та їх типи повинні в точності збігатися з полями бази даних. Ім'я бази даних записується в лапках.
DBAppendA (<ім'я бази>: String, <Поле1>, ..., <полеN>) - додає запис у початок бази даних. Кількість полів та їх типи повинні в точності збігатися з полями бази даних. Ім'я бази даних записується в лапках.
DBDelete (<ім'я бази>: String, <Поле1>, ..., <полеN>) - видаляє з бази даних запис. Кількість полів та їх типи повинні в точності збігатися з полями бази даних. Можливо, видаляти відразу групу записів, якщо які-небудь з полів будуть позначені порожній константою nil. Тоді будуть вилучені всі записи бази даних, в яких збігаються значення інших полів (які мають значення відмінні від nil).
DBClear (<ім'я бази>: String) - очищає базу даних.
Предикати роботи з файлами.
Дана версія Прологу працює тільки з текстовими файлами.
Для ідентифікації файлу під час роботи програми використовується цілочисельний номер обробника файлу, за яким можна звертатися до файлу.
FileOpenRead (<ім'я файлу>: String, <номер обробника>: Integer) - відкрити файл для читання. Предикат повертає в другому параметрі номер обробника файлу. У другому параметрі предиката повинна стояти вільна змінна.
FileOpenWrite (<ім'я файлу>: String, <номер обробника>: Integer) - відкрити файл для запису. Предикат повертає в другому параметрі номер обробника файлу. У другому параметрі предиката повинна стояти вільна змінна.
FileRead (<номер обробника>: Integer, <значення>) - читання з файлу. Другий параметр повинен бути вільною змінної, інакше інтерпретатор видасть помилку "Хибний аргумент при виклику предиката".
FileWrite (<номер обробника>: Integer, <значення>: String) - запис у файл.
FileClose (<номер обробника>: Integer) - закриття файлу. Даний предикат застосовувати не обов'язково, тому що при завершенні програми інтерпретатор сам закриває всі відкриті файли.
EOF (<номер обробника>: Integer) - перевірка кінця файлу. Предикат правдивий, якщо кінець файлу досягнутий.
Різне.
StringToList (String, <список>) - перетворює рядок у списку, що складається з символів цього рядка, і повертає його через параметр <список>.
Fail - предикат завжди повертає брехня.

3.8 Опис функцій

Арифметичні функції.
Sin (<Integer, Real>): Real - операція синуса. Аргументом може бути як реальне, так і ціле число. Функція повертає реальне число.
Cos (<Integer, Real>): Real - операція косинуса.
Tan (<Integer, Real>): Real - операція тангенса.
Exp (<Integer, Real>): Real - експонента.
Ln (<Integer, Real>): Real - натуральний логарифм.
Int (<Integer, Real>): Integer - виділення цілої частини числа. Функція використовується також для явного перетворення реального числа в ціле.
Frac (<Integer, Real>): Real - виділення дробової частини числа.
Abs (<Integer, Real>): <Integer, Real> - взяття модуля числа.
Функції роботи з рядками.
SubStr (String, N1: Integer, N2: Integer): String - виділення підрядка, починаючи з елементу з індексом N1 довжиною N2 символів.
FindStr (S1: String, S2: String): Integer - знаходить позицію підрядка S2 у рядку S1 і повертає індекс першого символу підрядка в рядку S1. Якщо в рядку S1 не було знайдено підрядка S2, то функція повертає 0.
Chr (Integer): String - повертає символ, що відповідає числу за таблицею ASCII.
Asc (String): Integer - повертає ASCII-код першого символу рядка.
NumbToStr (<Integer або Real>): String - перетворює число в рядок
StrToNumb (String): <Integer або Real> - перетворює рядок у ціле або реальне число, в залежності від змісту рядка. Інтерпретатор спочатку намагається перетворити рядок в ціле число. Якщо не виходить, то намагається перетворити рядок в реальне число. Якщо перетворення не вдалося, то виводиться повідомлення про помилку.
Логічні функції.
Not (Boolean): Boolean - інвертує значення логічного виразу. (УВАГА: щоб інвертувати значення, що повертає предикатом або базою даних необхідно перед ім'ям предиката або бази даних поставити символ "~")

4 Організаційно-економічна частина

4.1 Розрахунок витрат на розробку інтерпретатора Пролог

Трудомісткість розробки програмного забезпечення розраховується за формулою:
год / м, де (4.1)
L - обсяг програми в операторах, шт.,
nn - норма продуктивності праці програміста, що представляє собою обсяг корисної роботи, що виконується в одиницю часу,
Ф - середньомісячний фонд робочого часу,
К н - коефіцієнт новизни,
До ун - коефіцієнт використання в розробці типових програм.
L = 10000
nn = 50
Ф = 25
К н = 0.8
До ун = 0.7
Таким чином, трудомісткість розробки ПЗ становить:
T n = (10000.0 .8 · 0.7) / (25.50) = 4.5 год / м
Розрахунок вартості ч / м програміста:
· Заробітна плата програміста становить 460 руб.
· Додаткова заробітна плата становить 20% від основної, то є 92 руб.
· Нарахування на заробітну плату, в цілому, становлять 38.5% від основної та додаткової заробітної плати, 212.52 руб.
Разом вартість ч / м:
460 +92 +212.52 = 764.52 руб.
Накладні витрати складають:
З накл = 0.25 · 460 = 115 руб.
Вартість одного машинного години з урахуванням первісної вартості ЕОМ, вартості споживаної електроенергії і зносу машини определяетсяпо формулою:
S мч = S маш1 + S ел + S рем.
Термін служби ЕОМ - 8 років. Первісна вартість - 20000 руб. Споживана потужність 0.2 кВт / ч.
При експлуатації машини 8 годин на день маємо:
S маш1 = 20000 / (8.12.22.8) = 1.18 руб / год
Приймаючи вартість електроенергії 0.1 руб / КВт, вартість споживаної енергії в годину дорівнює:
S ел = 0.1 · 0.2 = 0.02 руб.
Витрати на профілактичне обслуговування та ремонт становлять 20% від вартості машини:
S рем = 0.2 · 1.18 = 0.17руб.
Тоді вартість одного машинного години дорівнює
S мч = 1.18 +0.2 +0.17 = 1.37 руб / год
Собівартість програмного продукту визначається:
, Де
З од - сума основної і додаткової заробітної плати розробника програми, нарахування на неї і накладні витрати, грн. / міс.,
Т ап - час витрачається розробником на розробку, складання алгоритму і написання програми, міс.,
З м - собівартість однієї години машинного часу, руб.,
До ісп = 0.5 - коефіцієнт використання ЕОМ.
764.52 · 4.5 +8 · 4.5 · 1.37 · 25.0 .5 = 4056.84 руб.

5 Промислова екологія та безпека

5.1 Введення

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

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

5.2.1 Джерела забруднення

У загальному випадку обчислювальна техніка являє собою деяку конструкцію, тобто сукупність деталей, що перебувають у певних просторових, механічних, електричних, магнітних і енергетичних взаємозв'язках. Тому в процесі виробництва обчислювальної техніки використовується цілий комплекс технологічних прийомів, пов'язаних з переробкою різних за своєю природою вихідних матеріалів, наступною обробкою і складанням деталей для отримання функціонально завершеного виробу.
У технологіях виробництва ЕОМ використовуються процеси, негативно впливають на навколишнє середовище, такі як лиття, термічна, гальванічна і механічна обробка, різання, пайка, зварювання і фарбування. Джерела, об'єкти первинного негативного впливу і застосовувані способи захисту середовища узагальнені в таблиці 5.4.
Ливарне виробництво пов'язане із забрудненням атмосфери пилом, окисом вуглецю, сірчистим ангідридом, а стічних вод механічними суспензіями, у вигляді пилу, флюсів, окалини.
При термічній обробці в атмосферу через систему вентиляції можуть викидатися пари масла, окису вуглецю, аміаку, ціаністого водню, а також пилу. Електротермічне устаткування споживає воду для охолодження, і в стічних водах можуть знаходитися шкідливі речовини.
Гальванічні роботи пов'язані з використанням великих обсягів води для приготування розчинів електролітів і промивних операцій. Тому стічні води в цих випадках значно забруднені отруйними хімічними речовинами. Крім того, повітря, що видаляється від технологічного гальванічного обладнання, містить велику кількість шкідливих речовин у різних агрегатних станах:
- Капельножидкими (бризки),
- Тонкодісперсіонном аерозолі,
- Паро-і газоподібному.
При механічній обробці матеріалів для охолодження обладнання та інструменту, промивки деталей, санітарно-гігієнічного обробки приміщень широко використовується вода. стічні води в цих випадках можуть бути забруднені мінеральними оліями, милами, металевої та абразивної пилом, емульгаторами. Крім того, при механічній обробці металів в атмосферу через систему вентиляції можуть викидатися пил, стружка, тумани масел і емульсій, а при обробці неметалічних матеріалів - шкідливі пари єднальних смол і пил.
Таблиця 5.1.
Технологічний процес
Об'єкт негативного впливу
Джерело забруднення
Спосіб захисту
Лиття
Атмосфера
Пило-газовиділення
Пиловловлення, фільтрація
Гідросфера
Стічні води
Фільтрування, відстоювання, реагентна обробка
Термічна обробка
Атмосфера
Пило-газовиділення
Пиловловлення, фільтрація
Гідросфера
Стічні води
Фільтрування, відстоювання, реагентна обробка
Гальванічна обробка
Атмосфера
Виділення шкідливих речовин в різному агрегатному стані
Очищення
Гідросфера
Стічні води
Те ж
Механічна обробка
Атмосфера
Пило-газовиділення
Пиловловлення, фільтрація
Гідросфера
Стічні води
Те ж
Різання, зварювання, паяння
Атмосфера
Пило-газовиділення
Пиловловлення, фільтрація
Гідросфера
Стічні води
Те ж
Лакофарбові роботи
Атмосфера
Газовиділення, лакофарбові тумани
Фільтрація
Гідросфера
Стічні води
Те ж
Збірка
Гідросфера
Стічні води
Те ж
Газова та плазмова різка металів, технологічні процеси зварювання і пайки супроводжуються виділенням пилу і токсичних газів, а стічні води можуть забруднюватися механічними домішками, кислотами.
Лакофарбові роботи пов'язані з виділенням в атмосферу шкідливих речовин у вид поромів розчинників і лакофарбових аерозолів у процесі нанесення покриття і при висиханні виробів. При збиранні такого роду приміщень стічні води можуть забруднюватися домішками розчинників лаків і фарб.
Процес отримання функціонально завершеного вироби закінчується складальними операціями. Негативний вплив на навколишнє середовище процесів складання менш відчутно. Однак і в цих випадках при проведенні санітарно-гігієнічного обробки виробничих приміщень у стічні води можуть потрапляти різні небажані домішки.

5.2.2 Очищення повітря від шкідливих домішок

Ділянка свердління й рубки друкованих плат виробляє викид склопластикової пилу - речовини 3 класу небезпеки за ГОСТ 12.1.007-76 ("Шкідливі речовини. Класифікація і загальні вимоги безпеки»).
Для захисту робочого персоналу від впливу домішки в приміщенні дільниці застосована вентиляційна система зі швидкістю руху повітря у витяжних столах 1.5 м / сек і загальною витратою очищуваного повітря на ділянці свердління й рубки друкованих плат L = 18000 м 3 / ч.
Для запобігання викиду склопластикової пилу в атмосферу застосовуємо як пиловловлювача циклон.
Вихідні дані:
обсяг очищуваного вентиляційного повітря Q = 5 м 3 / с,
щільність газу за робочих умов r = 1.3 кг / м 3,
в'язкість газу m = 42.2 × 10 -6 Па × с,
дисперсійний склад пилу d 50 і lgs ч = 0.77,
r ч = 1300 кг / м - щільність частинок пилу.
h = 0.9 - необхідна ефективність очищення газу.
Розрахунок циклону ведеться методом послідовних наближень у наступному порядку:
1. Вибираємо тип циклону - ЦН-24 і визначаємо оптимальну швидкість газу w оп в перетині циклону з діаметром D. З таблиці 1: w оп = 4.5 м / с.
2. Обчислюємо діаметр циклону D (м) за формулою = 0.3015 м.
Отримане значення округляємо до найближчого типового значення. Внутрішній діаметр циклону вибираємо D = 0.3 м.
3. За обраному діаметру циклону знаходимо дійсну швидкість руху газу в циклоні:
= 4.76 м / с,
де n = 1 - кількість циклонів.
4. Визначаємо коефіцієнт гідравлічного опору одиночного циклону:
= 67,
де
k 1 = 0.93 - поправочний коефіцієнт на діаметр циклону;
k 2 = 0.9 - поправочний коефіцієнт на запиленість газу;
= 80 - коефіцієнт гідравлічного опору одиночного циклону діаметром 500 мм, при C вх = 80 г / м.
5. Гідравлічний опір циклону обчислюється за формулою:
= 971 Па / м.
6. Ефективність очищення газу в циклоні обчислюється за формулою:
,
де
- Таблична функція від параметра x, рівного:
.
Для вибраного циклону значення = 8.5 мкм, = 0.308.
Значення визначаємо за формулою:
= 87,
де значення визначено за умовами роботи типового циклону: D T = 0.6 м, r чт = 1930 кг / м 3, m T = 22.2 * 10-6 Па * с, w T = 3.5 м / с.
Визначивши значення x, за даними таблиці 6 знаходимо параметр = 0.8413.
= 0.0921.
Отриманий коефіцієнт очищення більше необхідного, отже, тип циклону обраний вірно.

5.3 Аналіз впливу небезпечних і шкідливих факторів, при

експлуатації програми інтерпретатора Пролог

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

5.3.1 Підвищений рівень шуму на робочому місці

Шум при роботі засобів обчислювальної техніки виникає при роботі вентиляторів блоків живлення апаратури, пристроїв виведення інформації - принтерів, графопостроителей.
При тривалому впливі шуму на людину відбуваються небажані явища: знижується гострота слуху, підвищується кров'яний тиск. Крім того, шум впливає на загальний стан людини, викликаючи почуття невпевненості, обмеженості, тривоги, поганого самопочуття, що призводить до зниження продуктивності праці, виникнення помилок, може стати причиною травматизму.
Ослаблення шуму можна досягти наступними способами:
- Зменшення шуму в джерелі;
- Зміна спрямованості випромінювання;
- Раціональне планування робочого приміщення (звукоізоляція стін, вікон, дверей, стелі; установка штучних звукопоглощателей; розміщення більше тихих приміщень далеко від галасливих);
- Боротьба з шумом на шляху його поширення (звукоізолюючі огорожі, кожухи, екрани, кабіни).
Рівень шуму на робочому місці повинен відповідати вимогам ГОСТ 12.1.003-83. Відповідно до цього Держстандарту рівень звукового тиску на постійних робочих місцях у виробничих приміщеннях при тривалості шуму більше чотирьох годин повинен відповідати даним в таблиці 5.2
Приміщення
Середньогеометричні частоти октавних смуг, Гц
Рівень звуку, дБА
31.5
63
125
250
500
1000
2000
4000
8000
Рівні звукового тиску, дБ
постійні робочі місця в офісних приміщеннях
86
71
61
54
49
45
42
40
38
50

5.3.2 Небезпечний рівень напруги електричного кола, замикання якого може відбутися через людину

Всі використовувані в даній розробці засоби обчислювальної техніки в якості джерела живлення використовують змінну напругу мережі 220В, що може спричинити за собою ураження людини електричним струмом. Відповідно до класифікації приміщень за ступенем небезпеки електричної використовуваний робочий приміщення можна віднести до особливо небезпечних.
Причинами поразки людини електричним токів є:
- Випадковий дотик або наближення на небезпечну відстань до струмоведучих частин, що знаходяться під напругою;
- Поява напруги на металевих конструктивних частинах електрообладнання - корпусах, кожухах і т.д. в результаті пошкодження ізоляції та інших причин;
- Поява напруги на відключених струмовідних частинах, на яких працюють люди, внаслідок помилкового включення пристрою;
- Виникнення крокової напруги на поверхні землі в результаті замикання проводу на землю.
При роботі апаратури забороняється:
1. перевіряти на дотик наявність напруги струмоведучих частин апаратури;
2. застосовувати для з'єднання блоків і приладів проводи з пошкодженою ізоляцією;
3. проводити роботу і монтаж в апаратурі, що знаходиться під напругою;
4. підключати блоки і приладу до працюючої апаратури.
Щоб уникнути ураження електричним струмом використовуються наступні технічні засоби, що забезпечують безпеку робіт в електроустановках:
- Захисне заземлення;
- Захисне відключення;
- Занулення;
- Вирівнювання потенціалів.

5.3.3 Пожежна небезпека

Пожежі у ВЦ становлять особливу небезпеку, тому що пов'язані з величезними матеріальними втратами.
В якості пального компонента на ПЦ можуть служити будівельні матеріали для акустичної і естетичної обробки приміщень, перегородки, вікна, двері, підлоги, меблі, стелажі, магнітні стрічки і диски, ізоляція силових кабелів, а також радіотехнічні деталі і сполучні дроти електронної схеми.
Окислювач у вигляді кисню повітря є у будь-якій точці приміщення ОЦ.
Джерелами займання на ВЦ можуть бути електричні іскри, дуги і перегріті ділянки. Джерела займання виникають в електронних схемах, кабельних лініях, допоміжних електричних та електронних приладах, а також у пристроях, що застосовуються для технічного обслуговування елементів ЕОМ.
Таким чином, на ПЦ можуть бути присутніми всі три основні чинника, сприяють виникненню пожежі.
Кабельні лінії електроживлення складаються з горючого ізоляційного матеріалу, а також містять ймовірні джерела відкритого вогню. Вони є-найбільш небезпечним елементом в конструкції ЕОМ та обчислювального центру з точки зору виникнення і розвитку пожежі.
Іншим місцем, де може виникнути пожежа, є сховище інформації. Збиток від пожежі визначається не тільки вартістю згорілих магнітних стрічок і дисків, але і втратою інформації, записаної на ній.
Для забезпечення своєчасних заходів з виявлення та локалізації пожежі, евакуації робочого персоналу, а також для зменшення матеріальних втрат необхідно виконувати наступні умови:
- Наявність системи автоматичної пожежної сигналізації;
- Наявність евакуаційних шляхів і виходів;
- Наявність первинних засобів гасіння пожеж: пожежні стволи, внутрішні пожежні водопроводи, сухий пісок, вогнегасники.
Слід звернути особливу увагу на те, що застосування води в машинних залах ЕОМ, зважаючи на небезпеку пошкодження дорогого електронного обладнання можливо тільки у виняткових випадках, коли пожежа загрожує прийняти великі розміри.

5.3.4 Підвищений рівень електромагнітних випромінювань

Електромагнітні випромінювання впливають на нервову систему людини, змінюють орієнтацію кліток і ланцюгів молекул у відповідності з напрямком силових ліній електричного поля, біохімічну активність молекул і склад крові.
Діючі норми СНиП 848-70 передбачають наступні гранично допустимі величини:
1. напруженість електромагнітних полів радіочастот на робочих місцях на повинна перевищувати по електричної складової 20 В / м в діапазоні частот 100 кГц-30МГц і 5 В / м в діапазоні 30-300 МГц;
2. за магнітною складовою гранична величина дорівнює 5 А / м в діапазоні частот 100 кГц-1.5МГц.
Ослаблення потужності електромагнітного поля можна зробити наступним чином:
1. збільшити відстань між джерелом і робочим місцем;
2. встановити поглинальний або відображає екран між джерелом і робочим місцем.

5.3.5 Підвищена яскравість світла

Світло є важливим стимулятором не тільки зорового аналізатора, але й організму в цілому, а також загальної працездатності людини. Позитивний вплив його на продуктивність праці і якість роботи в даний час не викликає сумнівів.
Забезпечення гігієнічно раціональних умов освітлення сприяє тривалому збереженню працездатності, що призводить до зростання продуктивності праці і до зниження помилок у процесі праці.
Оскільки при роботі з програмним комплексом головним джерелом візуального відображення інформації є монітор, який представляє собою самосветящіеся прилад, то загальна освітленість може викликати перевантаження зорових органів, що призводить до підвищеного стомлення зору в процесі виконання робіт та підвищує небезпеку травматизму зорових органів.
Освітленість робочої зони повинна відповідати нормам СНиП 11-4-79 «Штучне освітлення для зорової роботи малою мірою точності (розряд V) та робота з самосветящіеся матеріалами (розряд VII).
Яскравість в поле зору працюючого повинна бути розподілена рівномірно. Оскільки в полі зору працюючого постійно перебувають поверхні, значно відрізняють за яскравістю (наприклад: екран монітора - текстовий документ і т.д.) то при перекладі погляду в яркоосвещенной на слабоосвещенную поверхню очей повинен переадаптіроваться. Часта переадаптаціі веде розвитку втоми зору. Ступінь нерівномірності визначається коефіцієнтом нерівномірності, який згідно з вимогами СНіП 11-4-79 для даного виду робіт повинен бути не менше 0.3 в межах робочої області.

5.3.6 Пряма і відбита бляклість

Пряма бляклість створюється в основному джерелами світла й освітлювальними приладами. Перебувають у полі зору відкриті лампи призводять до швидкого стомлення зору і зниження продуктивності праці. Відбита бляклість створюється робітниками поверхнями, що володіють коефіцієнтом дзеркального відображення у напрямку до ока працюючого. Відбита бляклість викликає засліпленість і веде до збільшення стомлення зору. Найбільш за все наявність бляклості притаманне моніторів, які функціонально є джерелом світла і частиною робочої області.
Бляклість монітора усувається наступними способами:
1. повинна бути можливість зміни його положення: поверхня екрана монітора встановлюється щодо вертикальної площини на +6 ... -15 градусів; щодо горизонтальної на 0 ... 45 градусів;
2. застосування спеціальної арматури - екранних фільтрів;
3. висота підвісу світильників повинна відповідати нормам СНиП 11-4-79.

5.3.7 Порушення мікроклімату робочих приміщень

Метеорологічні умови або мікроклімат у виробничих приміщеннях визначається наступними параметрами:
1. температура повітря, ° С;
2. відносна вологість,%;
3. швидкість руху повітря на робочому місці, м / с.
Робота з комплексом програмно-апаратних засобів відноситься до робіт легкої тяжкості (I категорія), тому що виконується сидячи або стоячи, може бути пов'язана з ходьбою, але не вимагає систематичного фізичного напруження і перенесення ваг. Згідно категорії проведених робіт і ГОСТ 12.1.005-76 оптимальні параметри мікроклімату при проведенні даної роботи повинні відповідати значенням, зазначеним у таблиці 5.3.
Таблиця 5.3.
Період року
Температура, ° С
Відносна вологість повітря,%
Швидкість повітря, м / с
Холодний і перехідний
20-23
60-40
0.1
Теплий
22-25
60-40
0.1
Запиленість повітря в машинному залі не повинна перевищувати 0.2 мг / м 2 при розмірі часток не більше 2 мкм.
Для забезпечення встановлених параметрів мікроклімату і чистоти повітря в машинному залі застосовують вентиляцію. У ВЦ застосовують загальнообмінну штучну вентиляцію в поєднанні з місцевою, як штучної, так і природною. Загальнообмінна вентиляція використовується для забезпечення в приміщеннях ВЦ відповідних мікрокліматичних параметрів; місцева - для охолодження власне ЕОМ і допоміжного обладнання.
У приміщеннях ОЦ передбачають систему опалення, яка повинна забезпечувати достатню, постійне і рівномірне нагрівання повітря в холодний період року.

5.3.8 Захист від психофізіологічних факторів

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

5.4 Аналіз використання захисних екранів для зниження

впливу небезпечних і шкідливих факторів, під час роботи на

автоматизованому робочому місці

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

5.4.1 Основні функції захисних екранів, необхідні для

зниження впливу шкідливих і небезпечних факторів, під час роботи

з програмним засобом

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

5.4.1.1 Захист від електростатичного та електромагнітного

впливів

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

5.4.1.2 Захист від рентгенівського випромінювання

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

5.4.1.3 Захист від ультрафіолетового випромінювання

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

5.4.2 Аналіз основних типів захисних екранів, які
прийнятні для зниження впливу шкідливих і небезпечних факторів,
під час з програмним засобом
На сьогоднішній день, на ринку є різні типи захисних екранів. Розглянемо опису деяких типів захисних екранів, які набули найбільшого поширення:

5.4.2.1 Сітчастий (повний захист зору)

Екран являє собою тонку нейлонову сітку, натягнуту на пластмасову рамку. Екран забезпечує деяке збільшення контрастності зображення і зменшення загальної яскравості екрану.
Основні захисні властивості:
- Поліпшення контрасту 400-500%;
- Зменшення загальної яскравості 50%.
Недоліки: даний тип екрану не рекомендується для використання, оскільки виникають побічні явища (муар, ореол) викликають неприємні відчуття у оператора.

5.4.2.2 Скляний двошаровий з заземленням (повний захист

зору, частковий захист здоров'я)

Екран виготовлений зі спеціальних сортів свинцевого скла. Скло укладено в пластмасову рамку з пристроєм кріплення до монітора і гніздом підключення до заземлення.
Основні захисні властивості:
- Електростатичне поле 70-80%
- Рентгенівське випромінювання 99.6%
- Придушення відблисків 97.3%
- Поліпшення контрасту 450-550%
- Зменшення загальної яскравості 55%
Недоліки: коефіцієнт придушення відблисків 97.2% (коефіцієнт дзеркального відображення 2.8%) недостатній для ефективного придушення відблисків. Підключення заземлення є фікцією, оскільки відсутні провідні верстви, нанесені на скло.

5.4.2.3 Скляний багатошаровий з заземленням (повний захист

зору, повний захист здоров'я)

Екран виготовлений зі спеціальних сортів скла сильно легованих атомами важких металів, на стороні зверненої до користувача нанесено поліефірне і п'ятишаровий діелектричні покриття, на зворотному боці вакуумним напиленням нанесений шар металевого срібла.
Скло укладено в пластмасову рамку з пристроєм кріплення до монітора і гніздом підключення заземлення.
Основні захисні властивості:
- Електростатичне поле 99.9%;
- НЧ поле 99.9%;
- Ультрафіолетове випромінювання 100%;
- Рентгенівське випромінювання 99.6%;
- Придушення відблисків 99.3%;
- Поліпшення контрасту 950-990%;
- Зменшення загальної яскравості 68%.

5.5 Розрахунок необхідної звукопоглинання, при роботі з АРМ

Шум при роботі з комп'ютером виникає при роботі вентиляторів охолодження блоків живлення ЕОМ і при роботі друкуючих пристроїв. Необхідно відзначити, що різниця рівня шуму між цими пристроями перевищує 10 Дб, тому шум роботи вентилятора охолодження блоку живлення ЕОМ можна до уваги не приймати.
Розглянемо потрібне зниження рівня звукового тиску для приміщення 5'10'4 метрів.
dL тр = L - L дод,
де
L - розрахункові або виміряні рівні звукового тиску
L доп - допустимі рівні рівня звукового тиску за ГОСТ 12.1003-83.
L = L принтера + 10Lg (S (X / S i) + 4 / B),
де
i вимірюється від 1 до m, m - кількість джерел шуму, в нашому випадку 2;
X - коефіцієнт, що залежить від ставлення відстаней між джерелами шуму r і r 1, причому r = 1.5м; r 1 = 3.4м і X = 1.
S i - площа півсфери, що проходить через розрахункову точку i і навколишній джерело, S 1 = 14.1м 2 і S 2 = 72.6м 2;
B - стала приміщення, причому B = B 1000 * M, де B 1000 - постійна приміщення на частоті 1000 Гц (для приміщення з жорсткою меблями і об'ємом 2000 м 3 маємо B 1000 = 10 м 2) і M - частотний множник.
Розрахунок представлений у таблиці 5.3:
Таблиця 5.3.
Показники
Середньогеометричні показники
октавних смуг, Гц
63
125
250
500
1000
2000
4000
8000
Lпрінетра, дБ
65
67
68
70
73
73
74
75
M
0.8
0.75
0.7
0.8
1
1.4
1.8
2.5
B, м 2
8
7.5
7
10Lg (S (X / S i) + 4 / B)
-2.3
-2
-1.8
-2.3
-3.1
-4.3
-5.1
-6.1
L, дБ
63
65
66
68
70
69
69
69
L дод, дБ
83
74
68
63
60
57
55
54
Розрахуємо площу, яку необхідно покрити звукопоглинаючим матеріалом, щоб отримати зниження шуму на 15дб. Як звукопоглинального матеріалу будемо використовувати мати з базальтового волокна.
S обл .= dA / a
де
dA - додатковий звукопоглинання, що вноситься облицюванням;
A - ревібраціонний коефіцієнт поглинання.
Для вибраного матеріалу при частоті 8кГц маємо a = 0.7. площа обмежуючих поверхонь дорівнює:
S огр = S стелі + S статі +2 * S п.стени +2 * S л.стени -2 * S вікна-S двері = 50 +50 +80 +40-4-2 = 214 м 2.
За номограмі визначаємо dA для a = 0.7 і S огр = 214м 2, отримуємо dA = 130м 2. Звідси маємо S обл = dA / a = 130/0.7 = 163м 2.
Якщо облицювати стелю і стіни, то отримаємо S обл = 164м 2, що приведе зниження рівня до допустимої норми.

Висновок

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

Література

1. Дж. Малпас Реляційний мова Пролог і його застосування - М.: Наука, 1990
2. Логічний підхід до штучного інтелекту під ред. Г. П. Гаврилова - М.: Світ, 1990
3. Д. Марселлус Програмування експертних систем на Турбо Пролозі - М.: Фінанси і статистика, 1994
4. У. Клоксін, К. Мелліш Програмування на мові Пролог - М.: Світ, 1987
5. Мова Пролог у п'ятому поколінні ЕОМ під ред. Н.І. Іллінського - М.: Мир, 1988
6. Дж. Доорс, А. Р. Рейблейн, С. Вандера Пролог-мова програмування майбутнього - М.: Фінанси і статистика, 1990
7. І. Братко Програмування на мові Пролог для штучного інтелекту - М.: Світ, 1990
8. Ахо А. Теорія синтаксичного аналізу, перекладу і компіляції - М.: Світ, 1979

Програми

Додаток 1

Інтерфейсна частина модуля інтерпретатора
unit CompileUnit;
interface
uses Windows, Classes, SysUtils, ProgFormUnit, ProgramClasses, SyncObjs,
Forms, dbTables, ProjectOptionsFormUnit;
{DEFINE PRED_COMPILER_DEBUG}
const
StandardLexemsCount = 16;
type
TSubStackNodeType = (ssntPredicate, ssntStdPredicate,
ssntArithmetic, ssntExtData);
TProgramSubStackNode = class (TObject)
ClauseIndex: integer; / / індекс пропозиції, на якому
/ / Була досягнута істина
CreatedVariables: TStrings; / / створені на цьому кроці змінні
FreeBefore: TStrings; / / Змінні, які перед цим кроком були вільні
TempVariables: TPrologVariables;
/ / Arithmetic: Boolean; / / True-якщо арифметичний терм
iType: TSubStackNodeType; / / Тип елемента
Term: TPrologTerm; / / Терм у програмі, якому
/ / Відповідає даний елемент
Belong: TObject; / / об'єкт TProgramStackNode,
/ / Якому належить даний об'єкт
ExtDataQuery: TQuery;
TheEndWasReached: Boolean;
/ / VarPacket: TPrologVariables; / / пакет зі змінними,
/ / Який вирушає далі
procedure ClearCreatedVariables;
procedure StepBack;
constructor Create;
destructor Destroy; override;
end;
TTraceMode = (tmNoTrace, tmTrace, tmStep);
/ / TmNoTrace - ні трасування
/ / TmTrace - трасування
/ / TmStep - трасування, не заходячи всередину викликаються предикатів
TProgramStackNode = class (TObject)
/ / Повністю описує поточний стан програми
PredicateName: string; / / ім'я предиката
Predicate: TProgramPredicate;
InputParameters: TPrologVariables;
Variables: TPrologVariables; / / змінні
SubStack: array of TProgramSubStackNode; / / integer; / / масив, в якому зберігаються індекси,
/ / На яких було досягнуто справжнє значення терма
CreatedVariables: array of array of string; / / Масив,
/ / У якому зберігаються імена створених на i-му кроці змінних
TermNumb: integer; / / Номер терма, на якому стоїть програма
ClauseNumb: integer; / / Номер пропозиції в предикаті
ClausesCount: integer;
TraceMode: TTraceMode;
OnBreakPoint: Boolean; / / True-якщо в даний момент стоїмо на контрольній точці
constructor Create;
destructor Destroy; override;
end;
TPrologProgram = class (TObject)
Domains: array of TProgramDomain;
ExtData: array of TProgramExtData;
Predicates: array of TProgramPredicate;
Stack: array of TProgramStackNode;
BreakPoints: array of Integer;
StartPredicate: string;
OnTheRun: Boolean; / / True-якщо програма запущена
Files: array of TPrologFile;
function CompileProgram: Boolean;
procedure RecieveStructurData;
procedure CutLexemsToPredicates (Lexems: TLexemsArray);
function CheckingBeforeCompile: Boolean;
procedure RunProgram (TraceMode: TTraceMode);
procedure EraseProgramStack;
function AddNodeToStack: TProgramStackNode;
function FindPredicate (PredicateName: string): TProgramPredicate;
function ExecutePredicate (var StackNode: TProgramStackNode): Boolean;
procedure DeleteLastNodeFromStack;
function DebugProcess (StackNode: TProgramStackNode): Boolean;
function PreDebugProcess (StackNode: TProgramStackNode): Boolean;
procedure CreateBreakPointsArray;
function CheckPredicateClausesCount (
Term: TPrologTerm;
SubStackNode: TProgramSubStackNode): Boolean;
constructor Create;
destructor Destroy; override;
function TranslateLexems (ProgPart: TStrings; / / var Lexems: TStringList;
var LexemsRecs: TLexemsArray;
Comments: Boolean = False): TPoint;
function AnalizeLexem (st: string): TLexemRecord;
procedure AddLexem (var LexemsRecs: TLexemsArray;
st: string; x, y, APos: integer);
procedure CheckBreakPoints (StackNode: TProgramStackNode);
end;
var
PrologProgram: TPrologProgram;
function TranslateSintax (var Predicate: TProgramPredicate): TPoint;
function AnalizeListElements (LRecs: TLexemsArray;
var DstVar: TPrologVariable): Boolean;
function AnalizeStructElements (LRecs: TLexemsArray;
var DstVar: TPrologVariable): Boolean;
function AnalizeArguments (Predicate: TProgramPredicate;
Lexems: TLexemsArray; var VArr: TVariablesArray;
CheckFlag: Boolean = True): boolean;
function CheckConstantType (
Param: TPrologVariable; Domain: string): boolean;
function CheckPredicateParameters (SubTerm
: TSubTermPredicate): Boolean;
function GetHelpContext (Lexem: TLexemRecord): LongInt;
function TestReservedFunction (st: String): Boolean;
function TestReservedPredicate (st: String): Boolean;

Додаток 2

Інтерфейсна частина модуля з додатковими класами інтерпретатора.
unit ProgramClasses;
interface
uses Classes, SysUtils, ProgFormUnit, dbtables, db, ProjectOptionsFormUnit;
type
TLexemErrors = (leString, leComment, leOk);
/ / LeString Не знайдено кінець рядка
/ / LeComment не знайдено кінець коментаря
/ / Види лексем
TLexemType = (ltPredicate, ltDomain, ltExtData,
ltVariable, ltFunction, ltUnknown,
ltPlus, ltMinus, ltMultiply, ltDivide,
ltLeftBracket, ltRightBracket,
ltLeftSquareBracket, ltRightSquareBracket,
ltListDivider, ltComma, ltPoint,
ltPointAndComma, ltEqual, ltIf, ltExclamation,
ltString, ltReal, ltInteger, ltTrue, ltFalse,
ltAnonimous, ltGT, ltLT, ltGE, ltLE,
ltReservedPredicate, ltNil, ltAnd, ltOr, ltNotEqual,
ltComment);
TLexemRecord = record
iType: TLexemType;
/ / Для LPredicate і LDomain обов'язковий ідентифікатор в st
st: string;
x, y: integer; / / координати лексеми
AbsPos: integer; / / абсолюная позиція у тексті
NoInverse: Boolean; / / Для ltPredicate - ознака відсутності або
/ / Наявності знака інверсії
end;
TLexemsArray = array of TLexemRecord;
TPrologVariablesTypes = (vtString, vtInteger, vtBoolean,
vtReal, vtList, vtStruct, vtUnknown, vtAnonimous);
TPrologVariable = class (TObject)
iType: TPrologVariablesTypes; / / Тип змінної
Name: string; / / Ім'я змінної
Data: Pointer; / / Об'єкт зі збереженої інформацією
procedure CreateVariable (DomainType: string; vName: string);
procedure DestroyVariable;
constructor Create;
destructor Destroy; override;
procedure ClearVariable;
function CreateCopy: TPrologVariable; / / створює точну копію змінної
/ / Ім'я змінної переноситься і в копію
procedure AssignVariable (v: TPrologVariable); / / присвоює значення
/ / Змінної. Ім'я змінної не змінюється
end;
TVariablesArray = array of TPrologVariable;
TPrologListType = (pltStdList, pltHeadTail);
/ / PltStdList - Елементи списку зберігаються в Elements
/ / PltHeadTail - представлений у вигляді голови і хвоста (використовуються тільки
/ / Два елементи масиву elements
TPrologVariableList = class (TObject)
ListName: string; / / ім'я типу списку
ElemName: string; / / Імена типу елементів
ListType: TPrologListType; / / Тип списку.
Elements: TVariablesArray; / / Елементи знаходяться в Data
DividerPos: integer; / / позиція роздільника у разі ListType = pltHeadTail
/ / Вказує, після якого елементу коштує роздільник
procedure ConvertList;
constructor Create;
destructor Destroy; override;
end;
TPrologVariableStruct = class (TObject)
StructName: string; / / ім'я типу структури
ElemTypes: array of string; / / імена типів елементів
Elements: array of TPrologVariable; / / Елементи знаходяться в Data
constructor Create;
destructor Destroy; override;
end;
TPrologVariables = class (TObject)
VarArr: array of TPrologVariable;
constructor Create;
destructor Destroy; override;
function Count: integer;
function High: integer;
procedure AddVariable (v: TPrologVariable);
procedure DeleteVariable (n: integer); overload;
procedure DeleteVariable (vName: string); overload;
procedure DeleteLastVariable;
function AddNewVariable: TPrologVariable;
function VariableByName (vName: string): TPrologVariable;
function GetVariable (ind: integer): TPrologVariable;
procedure SetVariable (ind: integer; v: TPrologVariable);
procedure ClearAndDestroyVariables;
property Variables [ind: integer]: TPrologVariable read GetVariable
write SetVariable; default;
end;
TSubTermPredicate = class (TObject)
Name: string;
StandardPredicate: Boolean; / / True - якщо предикат стандартний
Params: TVariablesArray;
NoInverse: Boolean; / / ознака відсутності інверсії
constructor Create;
destructor Destroy; override;
end;
TSubTermExtData = class (TObject)
Name: string;
Params: TVariablesArray;
NoInverse: Boolean; / / ознака відсутності інверсії
constructor Create;
destructor Destroy; override;
end;
TExdivssionOperation =
(EoPlus, eoMinus, eoMultiply, eoDivide, eoEqual,
eoGT, eoLT, eoGE, eoLE, eoVariable, eoFunction,
eoAnd, eoOR, eoNotEqual);
TSubTermExdivssion = class (TObject)
Operation: TExdivssionOperation;
VarName: String; / / ім'я перменной
FuncName: string; / / ім'я функції
StringStr: string; / / рядок для рядка константи
NumberInt: integer; / / число для цілої Контанти
NumberReal: Extended; / / число для реальної Контанти
BooleanVal: Boolean; / / Число для логічної константи
Operand: TPrologVariable;
LeftHand: TSubTermExdivssion; / / Покажчик на дані тип
/ / TSubTermExdivssion, TPrologVariable
RightHand: TSubTermExdivssion;
FuncParams: array of TSubTermExdivssion;
constructor Create;
destructor Destroy; override;
end;
TPrologTermType = (pttExdivssion, pttPredicate, pttExtData, pttCutting);
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Диплом
341.1кб. | скачати


Схожі роботи:
Організація роботи з файлами в системі ТУРБО-ПРОЛОГ
Інтерактивний інтерпретатор
Інтерпретатор muLisp
Інтерпретатор команд MS DOS
Питання розвитку мови і навчання рідної мови в педагогічній системі КД Ушинського
Питання розвитку мови і навчання рідної мови в педагогічній системі К Д Ушинського
Інтерферуючі вплив рідної мови при сприйнятті звуків англійської мови
Особливості російської мови Фразеологізми та їх значення у розвитку образності мови
Аналіз програми та підручників з української мови щодо вивчення частин мови в початковій школі
© Усі права захищені
написати до нас