Реферат: Интерпретатор языка Пролог
--PAGE_BREAK-- продолжение
--PAGE_BREAK--Система содержит интегрированную среду разработчика, которая предоставляет широкие возможности по визуальному вводу, редактированию и отладке программы на Прологе.
1 Исследовательская часть 1.1 Роль реляционных языков в развитии вычислительной техники В настоящее время растет круг практических систем, использующих достижения искусственного интеллекта на современных ЭВМ, появились престижные проекты создания ЭВМ новых поколений, в которых интеллектуальный интерфейс с конечным пользователем (непрофессионалом в информатике) является центральным элементом. В японском проекте создания ЭВМ пятого поколения язык Пролог прямо называется базовым языком программирования[5].
Близость Пролога к конечному пользователю объясняется тем, что он является декларативным языком. Чтобы задать определенную последовательность действий, приводящих к решению задачи, в программе на Прологе необходимо описать ее содержание в терминах объектов и отношений между ними. Таким образом, вместо алгоритма решения задачи, программист составляет ее логическую спецификацию.
Что же касается построения алгоритма, то это автоматически выполняется самой Пролог-системой с помощью встроенного механизма вывода. При этом цель решения задачи представляется в виде запроса к базе знаний, в которой содержится описание предметной области задачи. Для поиска в базе данных значений, требуемых в запросе, Пролог-система инициирует механизм вывода. Таким образом, вычисления в Прологе представляют собой процесс дедукции, направленный на построение доказательства целевого утверждения задачи.[1]
Семантика языка Пролог значительно отличается от семантики других языков программирования. Вообще, языки программирования можно разбить на три широкие категории в соответствии с природой семантики этих языков:
· Процедурные языки;
· Функциональные языки;
· Реляционные языки.
Смысл конструкции процедурного языка определяется в терминах поведения компьютера при выполнении этой конструкции. В функциональном языке смысл конструкции (например, вызов функции) определяется в терминах значения, которое она вырабатывает. А в реляционном языке – отношение между отдельными сущностями или классами сущностей. Таким образом, процедурные языки можно назвать языками низкого уровня, так как они дают картину мира, близкую к взгляду на мир с позиций компьютера. Языки же высокого уровня обеспечивают взгляд на мир, приближающийся к картине мира, представленной в спецификации задачи. При использовании идеального реляционного языка становится возможным написание программы, структурно изоморфной по отношению к своей спецификации, то есть для каждой вариации формы спецификации будет существовать соответствующая вариация формы программы.
Хотя Пролог и далек от идеального реляционного языка, он в то же время достаточно близок к такому языку. Это позволяет программисту воспользоваться упомянутыми выше преимуществами идеальных реляционных языков. Программист может мыслить в терминах структуры отношений, не заботясь о точности их трансляции в программу. То есть данный язык позволяет работать специалисту на высоком концептуальном уровне.[1]
Возможны три точки зрения программиста на Пролог-программу.
1. Реляционный подход. При этом программа рассматривается как множество взаимоопределенных, возможно очень сложных, взаимоотношений. Реляционный подход пригоден в том случае, когда хорошо известна структура предметной области. Процесс программирования при этом сводится к аксиоматическому определению каждого отношения. Входной и выходной потоки, а также поведение программы являются результатами действия запросов к отношению. Если отношение реализовано корректно, то будут правильными также входной и выходной потоки.
2. Подход к программе с позиций потока данных. Такой взгляд на программу уместен, когда известна природа выходного потока (то есть множество ответов). При программировании реализуется такая внутренняя структура программы, которая создает желаемый выходной поток. Если важен порядок следования ответов в выходном потоке, то при построении программы следует в явной форме учитывать процедурные факторы.
3. Поведенческий подход к программе. Поведенческий подход пригоден тогда, когда известно лишь желаемое поведение программы. Процесс программирования связан с построением такой внутренней структуры программы, которая обеспечит заданное поведение. При разработке такой программы следует обязательно учитывать процедурные факторы и влияние побочных эффектов.
Эти три подхода не являются взаимоисключающими, они представляют собой разные способы мышления в процессе программирования. С точки зрения стиля программирования рекомендуется применять либо реляционный подход, либо подход к программе с позиций потока данных, а к поведенческому следует прибегать лишь в случае крайней необходимости. Причина заключается в том, что программы, при составлении которых применялся поведенческий подход, почти всегда трудно читать, сопровождать и переводить с одной версии Пролог на другую.
1.2 Основные механизмы дедукции Существуют два метода логического вывода, называемые прямой цепочкой рассуждений и обратной цепочкой.
Прямая цепочка рассуждений предполагает использование правил для логического вывода новых фактов, а также фактов, которые имплицитно существовали ранее, но могут быть сделаны явными посредством применения правил. То есть механизм вывода работает для пополнения изначального запаса истинных фактов фактами, которые подразумеваются посредством набора правил. Подобная прямая цепочка рассуждений на практике неприменима: в системе с реальным числом правил имеется столь много подразумеваемых (скрытых) фактов, что, будучи обнаружены, они затмят те несколько фактов, которые действительно представляют интерес и являются полезными.
Однако системы, основанные на прямой цепочке рассуждений, существуют. Любая такая система имеет дополнительный механизм (иногда весьма специфичный в зависимости от проблемы) для того, чтобы определить, с каким следующим правил ей предстоит работать. Вместо простого цикла, который механически выбирает правила, механизм выбора четко устанавливает приоритет выбора тех или иных фактов и правил.
Рассмотрим теперь иной способ получения логического вывода на основе фактов и правил. Начнем с заключения, которое представляет для нас интерес и не является явным истинным фактом. Оно не находится среди хранимых фактов, когда мы запускаем систему.
Механизм вывода просматривает все правила, которые приводят к данному факту как к заключению. Затем механизм просматривает посылки этих правил. Возможно, они уже хранятся среди истинных фактов. Тогда можно считать, что изучаемых факт является истинным и должен быть добавлен в хранилище истинных фактов. Если ни одно из правил не может быть использовано для непосредственного определения рассматриваемого значения из-за того, что необходимо установить истинность их посылок, то в таком случае необходимо идти в обратном направлении и попытаться установить достоверность всех посылок в тех правилах, которые могут применяться для установления истинности конечного вывода. Перемещение на много уровней назад в древовидной структуре даст нам факты, которые являются истинными. Это и есть обратная цепочка рассуждений.
Механизм вывода на Прологе основан на обратной цепочке рассуждений. Процесс выполнения программы сводится к установлению истинности определенного предложения в Прологе (и обычно в определении величин определенных переменных в процессе) посредством обратной цепочки рассуждений и продолжается до тех пор, пока не будут найдены некоторые базовые истинные факты, известные системе.[3]
1.3 Исчисление предикатов как язык для решения задач Для автоматического анализа рассуждений необходим некоторый формальный язык, на котором можно формировать посылки и делать верные выводы. Все, что для этого требуется, — это возможность описать интересующую нас задачу и средства поиска соответствующих шагов в процессе логического вывода.
Исчисление предикатов первого порядка – это такая система в логике, в которой можно выразить большую часть того, что относится к математике, а также многое из разговорного языка. Эта система содержит правила логического вывода, позволяющие делать верные логические построения новых утверждений. Благодаря своей общности и логической силе исчисление предикатов может всерьез претендовать на использование его для машинного построения умозаключений.
Язык, подобный языку в исчислении предикатов, определяется его синтаксисом. Чтобы задать синтаксис, надо задать алфавит символов, которые будут использоваться в этом языке. Один из важных классов выражений в исчислении предикатов – это класс правильно построенных формул.
Мы обычно пользуемся языком для того, чтобы делать утверждения, касающиеся интересующей нас области. Отношения между языком и описываемой им областью определяется семантикой этого языка. Правильно построенные формулы исчисления предикатов как раз являются теми выражениями, которые мы будем использовать в качестве утверждений, касающихся интересующей нас области. Говорят, что правильно построенные формулы принимают значения T или F в зависимости от того, являются эти утверждения в этой области истинными или ложными. Приемы обращения с правильно построенными формулами позволяют строить умозаключения, относящиеся к некоторой области, и, следовательно, могут представить интерес при создании принятия решения, требующего такого умозаключения.[2]
1.3.1 Унификация и принцип резольвенции в исчислении предикатов Унификация – процесс, являющийся основным в формальных преобразованиях, выполняемых при нахождении резольвент.
Термы литерала могут быть переменными буквами, константными буквами и выражениями, состоящими из функциональных букв и термов. Подстановочный частный случай литерала получается при подстановке в литералы термов вместо переменных. Например, для литерала <shapetype id="_x0000_t75" coordsize=«21600,21600» o:spt=«75» o:divferrelative=«t» path=«m@4@5l@4@11@9@11@9@5xe» filled=«f» stroked=«f»><path o:extrusionok=«f» gradientshapeok=«t» o:connecttype=«rect»><lock v:ext=«edit» aspectratio=«t»><imagedata src=«66622.files/image001.wmz» o:><img width=«99» height=«24» src=«dopb269889.zip» v:shapes="_x0000_i1025"> частными случаями будут <imagedata src=«66622.files/image003.wmz» o:><img width=«101» height=«24» src=«dopb269890.zip» v:shapes="_x0000_i1026">, <imagedata src=«66622.files/image005.wmz» o:><img width=«99» height=«24» src=«dopb269891.zip» v:shapes="_x0000_i1027">, <imagedata src=«66622.files/image007.wmz» o:><img width=«123» height=«24» src=«dopb269892.zip» v:shapes="_x0000_i1028">, <imagedata src=«66622.files/image009.wmz» o:><img width=«97» height=«24» src=«dopb269893.zip» v:shapes="_x0000_i1029">.
Первый частный случай называется алфавитным вариантом исходного литерала, поскольку здесь вместо переменных, входящих в <imagedata src=«66622.files/image001.wmz» o:><img width=«99» height=«24» src=«dopb269889.zip» v:shapes="_x0000_i1030">, подставлены лишь частные переменные. Последний из четырех частных случаев называется константным частным случаем, или атомом, так как ни в одном из термов этого литерала нет переменных.
В общем случае любую подстановку можно представить в виде множества упорядоченных пар <imagedata src=«66622.files/image011.wmz» o:><img width=«239» height=«25» src=«dopb269894.zip» v:shapes="_x0000_i1031"> Пара <imagedata src=«66622.files/image013.wmz» o:><img width=«49» height=«25» src=«dopb269895.zip» v:shapes="_x0000_i1032"> означает, что повсюду переменная <imagedata src=«66622.files/image015.wmz» o:><img width=«17» height=«25» src=«dopb269896.zip» v:shapes="_x0000_i1033"> заменяется термом <imagedata src=«66622.files/image017.wmz» o:><img width=«15» height=«25» src=«dopb269897.zip» v:shapes="_x0000_i1034">. Существенно, что переменная в каждом ее вхождении заменяется одним и тем же термом. Для получения частных случаев литерала <imagedata src=«66622.files/image001.wmz» o:><img width=«99» height=«24» src=«dopb269889.zip» v:shapes="_x0000_i1035"> были использованы четыре подстановки
<imagedata src=«66622.files/image019.wmz» o:><img width=«159» height=«108» src=«dopb269898.zip» v:shapes="_x0000_i1036">
Обозначим через <imagedata src=«66622.files/image021.wmz» o:><img width=«25» height=«25» src=«dopb269899.zip» v:shapes="_x0000_i1037"> частный случай литерала P, получающийся при использовании подстановки <imagedata src=«66622.files/image023.wmz» o:><img width=«19» height=«20» src=«dopb269900.zip» v:shapes="_x0000_i1038">. Например, <imagedata src=«66622.files/image025.wmz» o:><img width=«225» height=«25» src=«dopb269901.zip» v:shapes="_x0000_i1039">. Композицией <imagedata src=«66622.files/image027.wmz» o:><img width=«28» height=«24» src=«dopb269902.zip» v:shapes="_x0000_i1040"> двух подстановок <imagedata src=«66622.files/image029.wmz» o:><img width=«17» height=«16» src=«dopb269903.zip» v:shapes="_x0000_i1041"> и <imagedata src=«66622.files/image031.wmz» o:><img width=«19» height=«24» src=«dopb269904.zip» v:shapes="_x0000_i1042"> называется результат применения <imagedata src=«66622.files/image031.wmz» o:><img width=«19» height=«24» src=«dopb269904.zip» v:shapes="_x0000_i1043"> к термам подстановки <imagedata src=«66622.files/image029.wmz» o:><img width=«17» height=«16» src=«dopb269903.zip» v:shapes="_x0000_i1044"> с последующим добавлением пар из <imagedata src=«66622.files/image031.wmz» o:><img width=«19» height=«24» src=«dopb269904.zip» v:shapes="_x0000_i1045">, содержащие переменные, не входящие в число переменных из <imagedata src=«66622.files/image029.wmz» o:><img width=«17» height=«16» src=«dopb269903.zip» v:shapes="_x0000_i1046">. Можно показать, что применение к литералу P последовательно подстановок <imagedata src=«66622.files/image029.wmz» o:><img width=«17» height=«16» src=«dopb269903.zip» v:shapes="_x0000_i1047"> и <imagedata src=«66622.files/image031.wmz» o:><img width=«19» height=«24» src=«dopb269904.zip» v:shapes="_x0000_i1048"> дает тот же результат, что и применение подстановки <imagedata src=«66622.files/image027.wmz» o:><img width=«28» height=«24» src=«dopb269902.zip» v:shapes="_x0000_i1049">, то есть <imagedata src=«66622.files/image033.wmz» o:><img width=«97» height=«28» src=«dopb269905.zip» v:shapes="_x0000_i1050">. Можно также показать, что композиция подстановок ассоциативна: <imagedata src=«66622.files/image035.wmz» o:><img width=«117» height=«24» src=«dopb269906.zip» v:shapes="_x0000_i1051">. Если подстановка <imagedata src=«66622.files/image023.wmz» o:><img width=«19» height=«20» src=«dopb269900.zip» v:shapes="_x0000_i1052"> применяется к каждому элементу множества <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1053"> литералов, то множество соответствующих ей частных случаев обозначается через <imagedata src=«66622.files/image039.wmz» o:><img width=«47» height=«25» src=«dopb269908.zip» v:shapes="_x0000_i1054">. Множество <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1055"> литералов называется унифицируемым, если существует такая подстановка <imagedata src=«66622.files/image023.wmz» o:><img width=«19» height=«20» src=«dopb269900.zip» v:shapes="_x0000_i1056">, что <imagedata src=«66622.files/image041.wmz» o:><img width=«163» height=«25» src=«dopb269909.zip» v:shapes="_x0000_i1057">. В этом случае подстановку <imagedata src=«66622.files/image023.wmz» o:><img width=«19» height=«20» src=«dopb269900.zip» v:shapes="_x0000_i1058"> называют унификатором <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1059">, поскольку ее применение сжимает множество до одного элемента. Наиболее общим (или простейшим) унификатором для <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1060"> будет такой унификатор <imagedata src=«66622.files/image043.wmz» o:><img width=«16» height=«20» src=«dopb269910.zip» v:shapes="_x0000_i1061">, что если <imagedata src=«66622.files/image023.wmz» o:><img width=«19» height=«20» src=«dopb269900.zip» v:shapes="_x0000_i1062"> - какой-нибудь унификатор для <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1063">, дающий <imagedata src=«66622.files/image039.wmz» o:><img width=«47» height=«25» src=«dopb269908.zip» v:shapes="_x0000_i1064">, то найдется подстановка <imagedata src=«66622.files/image045.wmz» o:><img width=«16» height=«20» src=«dopb269911.zip» v:shapes="_x0000_i1065">, для которой <imagedata src=«66622.files/image047.wmz» o:><img width=«115» height=«25» src=«dopb269912.zip» v:shapes="_x0000_i1066">.
Существует алгоритм, называемый алгоритмом унификации, который приводит к наиболее общему унификатору для унифицируемого множества <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1067"> литералов и сообщает о неудаче, если множество неунифицируемо. Алгоритм начинает работу с пустой подстановки и шаг за шагом строит наиболее общий унификатор, если такой существует.
Пусть исходные предложения задаются в виде <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1068"> и <imagedata src=«66622.files/image049.wmz» o:><img width=«43» height=«25» src=«dopb269913.zip» v:shapes="_x0000_i1069"> и переменные, входящие в <imagedata src=«66622.files/image049.wmz» o:><img width=«43» height=«25» src=«dopb269913.zip» v:shapes="_x0000_i1070">, не встречаются в <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1071"> и обратно. Пусть <imagedata src=«66622.files/image051.wmz» o:><img width=«80» height=«25» src=«dopb269914.zip» v:shapes="_x0000_i1072"> и <imagedata src=«66622.files/image053.wmz» o:><img width=«96» height=«25» src=«dopb269915.zip» v:shapes="_x0000_i1073"> - такие два подмножества <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1074"> и <imagedata src=«66622.files/image049.wmz» o:><img width=«43» height=«25» src=«dopb269913.zip» v:shapes="_x0000_i1075">, что для объединения <imagedata src=«66622.files/image055.wmz» o:><img width=«97» height=«25» src=«dopb269916.zip» v:shapes="_x0000_i1076"> существует наиболее общий унификатор <imagedata src=«66622.files/image043.wmz» o:><img width=«16» height=«20» src=«dopb269910.zip» v:shapes="_x0000_i1077">. Тогда говорят, что два предложения <imagedata src=«66622.files/image037.wmz» o:><img width=«35» height=«25» src=«dopb269907.zip» v:shapes="_x0000_i1078"> и <imagedata src=«66622.files/image049.wmz» o:><img width=«43» height=«25» src=«dopb269913.zip» v:shapes="_x0000_i1079"> разрешаются, а новое предложение <imagedata src=«66622.files/image057.wmz» o:><img width=«231» height=«25» src=«dopb269917.zip» v:shapes="_x0000_i1080"> является их резольвентой. Резольвента представляет выведенное предложение, и процесс образования резольвенты из двух «родительских» предложений называется резольвенцией.
Иными словами мы хотим иметь возможность находить доказательство того, что некоторая правильно построенная формула W в исчислении предикатов логически следует из некоторого множества S правильно построенных формул. Это задача эквивалентна задаче доказательства того, что множество <imagedata src=«66622.files/image059.wmz» o:><img width=«67» height=«24» src=«dopb269918.zip» v:shapes="_x0000_i1081"> неудовлетворимо. Процессы выявления неудовлетворимости некоторого множества предложений называются процессами опровержения.
Принцип резольвенции непротиворечив и полон. Непротиворечивость означает, что если когда-нибудь мы придем к пустому предложению, то исходное множество обязано быть неудовлетворимым. Полнота означает, что если исходное множество неудовлетворимо, то, в конце концов, мы придем к пустому предложению.[2]
1.3.2 Методы поиска доказательства в исчислении предикатов 1.3.2.1 Исчисление предикатов при решении задач Иногда достаточно только знать, следует ли логически правильно построенная формула W из некоторого множества S правильно построенных формул. Если W не следует из S, то, возможно, мы захотим знать, следует ~W из S. Конечно, в силу неразрешимости исчисления предикатов не всегда можно установить, следует ли W из S.
В других приложениях нужно знать значение элемента x (если он существует), при котором данная правильно построенная формула W (содержащая x в качестве переменной) логически следует из некоторого множества S правильно построенных формул. Иными словами, мы хотели бы знать, следует ли логически правильно построенная формула <imagedata src=«66622.files/image061.wmz» o:><img width=«76» height=«24» src=«dopb269919.zip» v:shapes="_x0000_i1082">, и если да, то каков тот частный случай переменной x. Проблема поиска доказательства правильно построенной формулы <imagedata src=«66622.files/image061.wmz» o:><img width=«76» height=«24» src=«dopb269919.zip» v:shapes="_x0000_i1083">, исходя из S, является обычной проблемой доказательства в исчислении предикатов, но для построения удовлетворяющего частного случая требуется, чтобы метод доказательства был «конструктивным».
Часто утверждения, относящиеся к задаче, делаются в форме фраз на разговорном языке, например английском. Поэтому естественно возникает вопрос, в каких случаях можно осуществить автоматический перевод с английского языка на язык исчисления предикатов. Написано несколько программ, позволяющих в ограниченных рамках перевод с естественного языка на язык предикатов, но способность работать с естественным языком пока находится в весьма неудовлетворительном состоянии.[1]
1.3.2.2 Стратегии перебора Непосредственное применение принципа резольвенции соответствует простой процедуре полного перебора при построении опровержения. Такой перебор мы начинается множества S, к которому добавляется резольвенты всех пар предложений в S с тем, чтобы образовать множество R. Затем добавляются резольвенты всех пар предложений в R с тем, чтобы образовать множество R(R(S))=R2(S), и т.д. Этот метод перебора как правило непригоден для практики, так как множества R(S), R2(S),… слишком быстро разрастаются. Практические процедуры доказательства определяются стратегиями перебора, применяемыми для его ускорения. Такие стратегии бывают трех типов: стратегии упрощения, стратегии очищения и стратегии упорядочения.[2]
1.3.2.3 Стратегии упрощения Иногда множество предложений удается упростить, исключив из него некоторые предложения или исключив из предложений определенные литералы. Эти упрощения таковы, что упрощенное множество предложений выполнимо тогда и только тогда, когда выполнимо исходное множество предложений. Таким образом, применение стратегий упрощения позволяет снизить скорость роста новых предложений.
Исключение тавтологий.
Любое предложение, содержащее литерал и его дополнение (такое предложение называется тавтологией), можно отбросить, так как любое невыполнимое множество, содержащее тавтологию, остается невыполнимым и после ее удаления.
продолжение
--PAGE_BREAK--
продолжение
--PAGE_BREAK--Потом из полученных лексем создается массив.
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
<imagedata src=«66622.files/image090.wmz» o:><img width=«239» height=«229» src=«dopb269933.zip» v:shapes="_x0000_i1102">
Рис 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;
продолжение
--PAGE_BREAK--
продолжение
--PAGE_BREAK--<imagedata src=«66622.files/image096.png» o:><img width=«203» height=«135» src=«dopb269936.zip» v:shapes="_x0000_i1105"> <imagedata src=«66622.files/image098.png» o:><img width=«143» height=«201» src=«dopb269937.zip» v:shapes="_x0000_i1106">
а) б)
Рис. 3.3. Вид окна конструктора типов: а) конструктор списков;
б) конструктор структур
При добавлении описания базы данных появляется окно для ввода структуры базы данных. В этом окне необходимо ввести имя базы данных в поле «Имя». Это имя будет использоваться в программе. Также необходимо ввести, либо выбрать из списка имя файла базы данных. Имя базы данных, которое будет использоваться в программе, и имя файла могут отличаться. Для внесения поля в базу данных необходимо выбрать тип поля из списка, ввести его длину, а также его имя в базе данных и нажать на кнопку плюс на нижней панели. Если база данных уже существует, то ее структуру можно ввести, нажав на кнопку «Поля таблицы» на нижней панели (вторая справа). Тогда появится окно, в котором будет список из полей базы данных. Можно будет выбрать те поля, с которыми будет работать программа. При нажатии на кнопку «Ок» выбранные поля будут внесены в список.
<imagedata src=«66622.files/image100.png» o:><img width=«180» height=«203» src=«dopb269938.zip» v:shapes="_x0000_i1107">
Рис. 3.4. Вид окна конструктора баз данных
Ввод предиката производится аналогично вводу нового типа.
Для редактирования элемента любого из списков можно дважды щелкнуть по нужному элементу. Для удаления элемента из списка нужно щелкнуть по нему, а затем нажать на кнопку минус.
При однократном нажатии на элемент с именем предиката текстовый курсор в окне редактора автоматически перейдет к тому месту в программе, где описывается данный предикат.
Текст программы вводится в окне редактора. Это окно состоит из панели инструментов и редактора. На панели инструментов находится кнопки для копирования, вырезания и вставки фрагмента текста, а также кнопка по установки контрольной точки в тексте. Из окна редактора можно мгновенно получить справку о любом стандартном предикате или функции, набрав имя предиката или функции в тексте и нажав кнопку F1.
<imagedata src=«66622.files/image102.png» o:><img width=«215» height=«174» src=«dopb269939.zip» v:shapes="_x0000_i1108">
Рис. 3.5. Вид окна редактора.
В процессе написания программы используются стандартные средства редактора операционной системы Windows. Окно редактора поддерживает стандартные операции с буфером обмена Windows, выполняемые по нажатию горячих клавиш, а также выделение областей текста. Поддерживаются следующие горячие клавиши:
Shift — стрелки вверх, вниз, вправо, влево, Home, End — выделение области текста для операций;
Ctrl-Insert или Ctrl-C — копировать выделенную область в буфер обмена;
Shift-Insert или Ctrl-V — вставить фрагмент из буфера обмена;
Shift-Del или Ctrl-X — вырезать фрагмент в буфер обмена.
Перед запуском программы в окне опций проекта необходимо установить имя базы алиаса (если используются базы данных) и имя запускаемого предиката. Если не задано имя запускаемого предиката, программа не запустится.
<imagedata src=«66622.files/image104.png» o:><img width=«179» height=«125» src=«dopb269940.zip» v:shapes="_x0000_i1109">
Рис. 3.6. Вид окна опций проекта.
3.3.4 Запуск программы на Прологе и ее отладка
Для запуска программы на главном окне надо нажать на кнопку «Запуск» или в меню «Проект» нажать на пункт с таким же названием. После нажатия на кнопку происходит компиляция программы. В статусной строке в главном окне появляется надпись «Компиляция». Если во время были найдены ошибки, то на экран появляется окно со списком найденных ошибок. При двойном щелчке по строке с названием ошибки текстовый курсор в окне редактора перейдет к месту в тексте, где была найдена ошибка.
Если процесс компиляции прошел нормально, то программа запускается на исполнение. Процесс выполнения программы может быть прерван нажатием на кнопки «Стоп» или «Пауза» в главном окне, а также, если программа приступила к обработке оператора, на котором установлена контрольная точка. При временной остановке на экран появляются два окна: окно трассировки и окно стека.
В окно «Трассировка» выводится протокол работы программы, то каждый вызов предиката, базы данных или арифметического выражения, а также возвращаемые ими значения.
<imagedata src=«dopb269941.zip» o:><img width=«288» height=«142» src=«dopb269941.zip» v:shapes="_x0000_i1110">
Рис. 3.7. Вид окна трассировки.
В окне «Стек» можно просмотреть стек программы. Стек представлен в виде древовидной структуры. В корне дерева находятся вызовы предикатов. Развернув корневой элемент дерева можно увидеть параметры, с которыми был вызван предикат и переменные, которые были созданы в процессе выполнения предиката.
Общий вид корневого элемента дерева выглядит следующим образом: «Имя предиката n1: n2», где n1 — номер предложения, n2 — номер условия в предложении.
<imagedata src=«dopb269942.zip» o:><img width=«206» height=«190» src=«dopb269942.zip» v:shapes="_x0000_i1111">
Рис.3.8. Вид окна стека.
3.3.5 Работа с меню Для удобства пользователя при выборе команд в программу введена система меню, которая содержит следующие пункты:
– Файл
– Окна
– Проект
– Настройка
– Помощь
Меню Файл содержит следующие пункты.
Создать — позволяет создать новую программу на Прологе.
Открыть — позволяет открыть имеющийся файл и выводит стандартное окно Windows для открытия файла:
<imagedata src=«dopb269943.zip» o:><img width=«432» height=«269» src=«dopb269943.zip» v:shapes="_x0000_i1112">
Рис.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 — выделение целой части числа. Функция используется также для явного преобразования реального числа в целое.
продолжение
--PAGE_BREAK--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 Расчет затрат на разработку интерпретатора Пролог Трудоемкость разработки программного обеспечения рассчитывается по формуле:
<imagedata src=«66622.files/image109.wmz» o:><img width=«152» height=«37» src=«dopb269944.zip» v:shapes="_x0000_i1113"> ч/м, где (4.1)
L — объем программы в операторах, шт.,
nn — норма производительности труда программиста, представляющая собой объем полезной работы, выполняемой в единицу времени,
Ф — среднемесячный фонд рабочего времени,
Кн — коэффициент новизны,
Кун — коэффициент использования в разработке типовых программ.
L = 10000
nn = 50
Ф = 25
Кн = 0.8
Кун = 0.7
Таким образом, трудоемкость разработки ПО составляет:
Tn = (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 руб/ч.
Себестоимость программного продукта определяется:
<imagedata src=«66622.files/image111.wmz» o:><img width=«227» height=«25» src=«dopb269945.zip» v:shapes="_x0000_i1114">, где
Зод — сумма основной и дополнительной заработной платы разработчика программы, начисления на нее и накладные расходы, руб./мес.,
Тап — время затрачиваемое разработчиком на разработку, составление алгоритма и написание программы, мес.,
См — себестоимость одного часа машинного времени, руб.,
Кисп = 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 Па×с,
дисперсионный состав пыли d50 и lgsч=0.77,
rч=1300 кг/м – плотность частиц пыли.
h=0.9 – требуемая эффективность очистки газа.
Расчет циклона ведется методом последовательных приближений в следующем порядке:
1. Выбираем тип циклона – ЦН-24 и определяем оптимальную скорость газа wоп в сечении циклона с диаметром D. Из таблицы 1: wоп=4.5 м/с.
2. Вычисляем диаметр циклона D(м) по формуле <imagedata src=«66622.files/image113.wmz» o:><img width=«79» height=«49» src=«dopb269946.zip» v:shapes="_x0000_i1115">=0.3015 м.
Полученное значение округляем до ближайшего типового значения. Внутренний диаметр циклона выбираем D=0.3 м.
3. По выбранному диаметру циклона находим действительную скорость движения газа в циклоне:
<imagedata src=«66622.files/image115.wmz» o:><img width=«69» height=«41» src=«dopb269947.zip» v:shapes="_x0000_i1116">=4.76 м/с,
где n=1 – количество циклонов.
4. Определяем коэффициент гидравлического сопротивления одиночного циклона:
<imagedata src=«66622.files/image117.wmz» o:><img width=«95» height=«24» src=«dopb269948.zip» v:shapes="_x0000_i1117">=67,
где
k1=0.93 – поправочный коэффициент на диаметр циклона;
k2=0.9 – поправочный коэффициент на запыленность газа;
<imagedata src=«66622.files/image119.wmz» o:><img width=«27» height=«24» src=«dopb269949.zip» v:shapes="_x0000_i1118">=80 – коэффициент гидравлического сопротивления одиночного циклона диаметром 500 мм, при Cвх=80 г/м.
5. Гидравлическое сопротивление циклона вычисляется по формуле:
<imagedata src=«66622.files/image121.wmz» o:><img width=«169» height=«44» src=«dopb269950.zip» v:shapes="_x0000_i1119">=971 Па/м.
6. Эффективность очистки газа в циклоне вычисляется по формуле:
<imagedata src=«66622.files/image123.wmz» o:><img width=«109» height=«23» src=«dopb269951.zip» v:shapes="_x0000_i1120">,
где
<imagedata src=«66622.files/image125.wmz» o:><img width=«37» height=«21» src=«dopb269952.zip» v:shapes="_x0000_i1121"> - табличная функция от параметра x, равного:
<imagedata src=«66622.files/image127.wmz» o:><img width=«325» height=«52» src=«dopb269953.zip» v:shapes="_x0000_i1122">.
Для выбранного циклона значение <imagedata src=«66622.files/image129.wmz» o:><img width=«23» height=«25» src=«dopb269954.zip» v:shapes="_x0000_i1123">=8.5 мкм, <imagedata src=«66622.files/image131.wmz» o:><img width=«35» height=«24» src=«dopb269955.zip» v:shapes="_x0000_i1124">=0.308.
Значение <imagedata src=«66622.files/image133.wmz» o:><img width=«23» height=«24» src=«dopb269956.zip» v:shapes="_x0000_i1125"> определяем по формуле:
<imagedata src=«66622.files/image135.wmz» o:><img width=«273» height=«49» src=«dopb269957.zip» v:shapes="_x0000_i1126">=87,
где значение <imagedata src=«66622.files/image137.wmz» o:><img width=«23» height=«25» src=«dopb269954.zip» v:shapes="_x0000_i1127"> определено по условиям работы типового циклона: DT=0.6 м, rчт=1930 кг/м3, mT=22.2*10-6 Па*с, wT=3.5 м/с.
Определив значение x, по данным таблицы 6 находим параметр <imagedata src=«66622.files/image138.wmz» o:><img width=«37» height=«21» src=«dopb269952.zip» v:shapes="_x0000_i1128">=0.8413.
<imagedata src=«66622.files/image123.wmz» o:><img width=«109» height=«23» src=«dopb269951.zip» v:shapes="_x0000_i1129">=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
продолжение
--PAGE_BREAK--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 Стеклянный двухслойный с заземлением (частичная защита зрения, частичная защита здоровья) Экран изготовлен из специальных сортов свинцового стекла. Стекло заключено в пластмассовую рамку с устройством крепления к монитору и гнездом подключения к заземлению.
Основные защитные свойства:
продолжение
--PAGE_BREAK--– электростатическое поле 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/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.
Рассчитаем площадь, которую необходимо покрыть звукопоглощающим материалом, чтобы получить снижение шума на 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);
еще рефераты
Еще работы по информатике
Реферат по информатике
Интерактивный интерпретатор
18 Июня 2015
Реферат по информатике
Основы программирования на языке Си
18 Июня 2015
Реферат по информатике
Excel решение задач с подбором параметров
2 Сентября 2013
Реферат по информатике
Назначение и основные функции электронных таблиц
2 Сентября 2013