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
Интерфейсная часть модуля интерпретатора
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;
Интерфейсная часть модуля с дополнительными классами интерпретатора.
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;