Интерпретатор языка Пролог
Для обеспечения своевременных мер по обнаружению и локализации пожара, эвакуации рабочего персонала, а также для уменьшения материальных потерь необходимо выполнять следующие условия:
наличие системы автоматической пожарной сигнализации;
наличие эвакуационных путей и выходов;
наличие первичных средств тушения пожаров: пожарные стволы, внутренние пожарные водопроводы, сухой песок, огнетушители.
Следует обратить особое внимание на то, что применение воды в машинных залах ЭВМ, ввиду опасности повреждения дорогостоящего электронного оборудования возможно только в исключительных случаях, когда пожар угрожает принять крупные размеры.
5.3.4 Повышенный уровень электромагнитных излучений
Электромагнитные излучения влияют на нервную систему человека, изменяют ориентацию клеток и цепей молекул в соответствии с направлением силовых линий электрического поля, биохимическую активность молекул и состав крови.
Действующие нормы СНиП 848-70 предусматривают следующие предельно допустимые величины:
напряженность электромагнитных полей радиочастот на рабочих местах на должна превышать по электрической составляющей 20 В/м в диапазоне частот 100 кГц-30МГц и 5 В/м в диапазоне 30-300 МГц;
по магнитной составляющей предельная величина равна 5 А/м в диапазоне частот 100 кГц-1.5МГц.
Ослабления мощности электромагнитного поля можно достичь следующими способами:
увеличить расстояние между источником и рабочим местом;
установить поглощающий или отражающий экран между источником и рабочим местом.
5.3.5 Повышенная яркость света
Свет является важным стимулятором не только зрительного анализатора, но и организма в целом, а также общей работоспособности человека. Положительное влияние его на производительность труда и качество работы в настоящее время не вызывает сомнений.
Обеспечение гигиенически рациональных условий освещения способствует длительному сохранению работоспособности, что приводит к росту производительности труда и к снижению ошибок в процессе труда.
Поскольку при работе с программным комплексом главным источником визуального отображения информации является монитор, который представляет собой самосветящийся прибор, то общая освещенность может вызвать перегрузку зрительных органов, что приводит к повышенному утомлению зрения в процессе выполнения работ и повышает опасность травматизма зрительных органов.
Освещенность рабочей зоны должна соответствовать нормам СНиП 11-4-79 «Искусственное освещение для зрительной работы малой степени точности (разряд V) и работа с самосветящимися материалами (разряд VII).
Яркость в поле зрения работающего должна быть распределена равномерно. Поскольку в поле зрения работающего постоянно находятся поверхности, значительно отличающие по яркости (например: экран монитора - текстовый документ и т.д.) то при переводе взгляда в яркоосвещенной на слабоосвещенную поверхность глаз должен переадаптироваться. Частая переадаптация ведет развитию утомления зрения. Степень неравномерности определяется коэффициентом неравномерности, который согласно требованиям СНиП 11-4-79 для данного вида работ должен быть не менее 0.3 в пределах рабочей области.
5.3.6 Прямая и отраженная блеклость
Прямая блеклость создается в основном источниками света и осветительными приборами. Находящиеся в поле зрения открытые лампы приводят к быстрому утомлению зрения и снижению производительности труда. Отраженная блеклость создается рабочими поверхностями, обладающими коэффициентом зеркального отражения по направлению к глазу работающего. Отраженная блеклость вызывает ослепленность и ведет к увеличению утомления зрения. Наиболее всего наличие блеклости присуще мониторам, которые функционально являются источником света и частью рабочей области.
Блеклость монитора устраняется следующими способами:
должна быть возможность изменения его положения: поверхность экрана монитора устанавливается относительно вертикальной плоскости на +6…-15 градусов; относительно горизонтальной на 0…45 градусов;
применение специальной арматуры - экранных фильтров;
высота подвеса светильников должна соответствовать нормам СНиП 11-4-79.
5.3.7 Нарушение микроклимата рабочих помещений
Метеорологические условия или микроклимат в производственных помещениях определяется следующими параметрами:
температура воздуха, С;
относительная влажность, %;
скорость движения воздуха на рабочем месте, м/с.
Работа с комплексом программно-аппаратных средств относится к работам легкой тяжести (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 Дб, поэтому шум работы вентилятора охлаждения блока питания ЭВМ можно в расчет не принимать.
Рассмотрим требуемое снижение уровня звукового давления для помещения 5104 метров.
dLтр = L - Lдоп,
где
L - расчетные или измеренные уровни звукового давления
Lдоп - допустимые уровни уровня звукового давления по ГОСТ 12.1003-83.
L=Lпринтера + 10Lg((X/Si) + 4/B),
где
i измеряется от 1 до m, m - количество источников шума, в нашем случае 2;
X - коэффициент, зависящий от отношения расстояний между источниками шума r и r1, причем r=1.5м; r1=3.4м и X=1.
Si - площадь полусферы, проходящая через расчетную точку i и окружающий источник, S1=14.1м2 и S2=72.6м2;
B - постоянная помещения, причем B=B1000*M, где B1000 - постоянная помещения на частоте 1000 Гц (для помещения с жесткой мебелью и объемом 2000 м3 имеем B1000=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((X/Si) + 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, что приведет снижение уровня до допустимой нормы.
Заключение
В результате проектирования был разработан интерпретатор языка Пролог с возможностью работы с универсальными базами данных.
Для удобства работы с программы была создана интегрированная среда разработчика, имеющая средства для визуального ввода программы, систему меню, экранных форм и оперативной подсказки, правила работы с которыми изложены в руководстве пользователя.
Был проведен расчет затрат на разработку программы интерпретатора и интегрированной среды разработчика.
Рассмотрены вопросы, связанные с промышленной экологией и безопасностью при работе с программой интерпретатора.
Предлагаемая программа интерпретатора языка Пролог создана в соответствии с требованиями технического задания.
Литература
Дж. Малпас Реляционный язык Пролог и его применение - М.:Наука,1990
Логический подход к искусственному интеллекту под ред. Г.П.Гаврилова - М.:Мир,1990
Д. Марселлус Программирование экспертных систем на Турбо Прологе - М.:Финансы и статистика, 1994
У. Клоксин, К.Меллиш Программирование на языке Пролог - М.:Мир, 1987
Язык Пролог в пятом поколении ЭВМ под ред. Н.И. Ильинского - М.:Мир, 1988
Дж. Доорс, А.Р.Рейблейн, С.Вандера Пролог-язык программирования будущего - М.:Финансы и статистика, 1990
И. Братко Программирование на языке Пролог для искусственного интеллекта - М.:Мир, 1990
Ахо А. Теория синтаксического анализа, перевода и компиляции - М.:Мир, 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;
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, ecExpressionValue,
ecArgsCount, ecArgType, ecTan, ecRealAsInteger, ecTypeInExtData,
ecListTail,ecPredicateParams,ecExtDataAbsent, ecExtDataDelete,
ecRangeError,ecConvertError,ecFileOpenError,ecFileCloseError,
ecFileAccessError,
ecCloseProgram,
ecStopPrologProgram);
//ecType - ошибка типа
//ecNo - нет ошибок
//ecOverflow - переполнение
//ecDivideZero - деление на ноль
//ecExpressionValue - выражение возвращает нелогическое значение
//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, 2, 3, 4
|