Смекни!
smekni.com

Интерпретатор языка Пролог (стр. 14 из 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;

TExpressionOperation=

(eoPlus, eoMinus, eoMultiply, eoDivide, eoEqual,

eoGT, eoLT, eoGE, eoLE, eoVariable, eoFunction,

eoAnd, eoOR, eoNotEqual);

TSubTermExpression=class(TObject)

Operation :TExpressionOperation;

VarName :String; //имя перменной

FuncName :string; //имя функции

StringStr :string; //строка для строки константы

NumberInt :integer; //число для целой контанты

NumberReal :Extended; //число для реальной контанты

BooleanVal :Boolean; //Число для логической константы

Operand :TPrologVariable;

LeftHand :TSubTermExpression; //Указатель на данные тип

//TSubTermExpression, TPrologVariable

RightHand :TSubTermExpression;

FuncParams :array of TSubTermExpression;

constructor Create;

destructor Destroy; override;

end;

TPrologTermType=(pttExpression,pttPredicate,pttExtData,pttCutting);

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;