Программа "иоц" как предикат метаязыка

Как отмечалось в разд. 0.9 и 6,5, смысл ответа на Пролог-запрос определяется метаязыковым предикатом с двумя неявными параметрами:

стратегией решения задач, которая является стратегией интерпретатора языка Пролог, и множеством фраз, используемых при обработке запроса, которое ограничено фразами, содержащимися в текущей программе. В разд. 6.5 рассматривалась роль процедуры "послать" как предиката метаязыка, явно определяющего множество фраз, которое должно использоваться при выполнении запроса. С этих позиций процедура "иоц" является метаязыковым предикатом, который явно задает стратегию решения задач. Следовательно, смысл ответа на запрос, полученного при помощи процедуры "иоц", заключается в следующем:

Запрос доказуем или недоказуем при помощи стратегии решения задач, обнаруживающей циклы, в соответствии с фразами текущей программы.

7.5. Заключение: стиль программирования на прологе Суть компьютерной программы

Мы употребляем термин "система" для обозначения некоторой ограниченной части мира, которую программист хочет представить в виде программы (т.е. предметную область, моделируемую программой). Задача программиста, пишущего программу на любом языке, заключается в воплощении структуры нужной системы в программе. Прикладная программа состоит из двух компонент: из описания структуры системы и из процедуры, способной преобразовать и реализовать смысл этого описания. Программист, пользующийся процедурным языком, скажем языком Си, как правило должен уделить внимание обеим компонентам. Как отмечалось в разд. 6.1, вычислительный формализм состоит из дескриптивного языка и обрабатывающей структуры (т.е. множества процедур), способной реализовать смысл выражений дескриптивного языка. Следовательно, программист, пользующийся вычислительным формализмом, может сконцентрировать свои силы на описании системы при помощи дескриптивного языка этого формализма и положиться на обрабатывающую структуру в том, что касается реализации смысла описания. Такой подход к использованию вычислительного формализма адекватен только для таких ситуаций, когда формализм обладает достаточной выразительной силой для описания системы.

Три стадии изучения Пролога

Если трактовать Пролог как вычислительный формализм, то он состоит из дескриптивного языка и обрабатывающей структуры (интерпретатора), реализующей формальный смысл выражений этого дескриптивного языка, Процесс обучения программированию на Прологе можно разделить на три стадии. На первой стадии программист познает силу Пролога как вычислительного формализма, занимаясь написанием программ, состоящих из чисто декларативных фраз. Иными словами, программист должен изучить основные свойства обрабатывающей структуры Пролога (т.е. действия интерпретатора) , когда не применяются побочные эффекты (к их числу относятся встроенные предикаты "сократить", "assert", "retract", "write" и т.д.). Именно поэтому в данной главе и в гл. 3 так много внимания уделялось обсуждению стратегии решения задач интерпретатора Пролога.

Со временем, однако, программист начинает сталкиваться с такими ситуациями, при которых нельзя обойтись одной лишь основной обрабатывающей структурой Пролога. К примеру, могут потребоваться такие вычисления, которые невозможно осуществить на Прологе без применения побочных эффектов. В этой ситуации программист не может рассчитывать на то, что обрабатывающая структура интерпретатора окажется достаточной для выполняемой программы. Поэтому на второй стадии обучения языку Пролог программист узнает, как нужно пользоваться побочными эффектами для построения сложных управляющих структур в Пролог - программе. На этой стадии обучения требуется усвоить бихевиористический подход к языку (см. разд. 4.3). Во время данной фазы обучения программисты могут почувствовать искушение пользоваться побочными эффектами чуть ли не в каждой фразе программы.

Пролог-процедура, не полагающаяся на побочные эффекты, обладает четким декларативным смыслом и целиком является составной частью дескриптивной части программы. Однако Пролог-процедура с побочными эффектами не имеет декларативного смысла. Если побочные эффекты встречаются в процедуре, ориентированной на конкретную область применения (примером такой специализированной процедуры может служить процедура "место" из разд. 3,7), то такую процедуру следует рассматривать как некоторую смесь описания и обработки. Такая процедура ухудшает свойства Пролога как вычислительного формализма, делая менее четким различие между описанием и обработкой.

Если побочные эффекты употребляются в процедуре общего назначения (примерами таких универсальных процедур являются процедура "findall" из приложения 11 и процедура "послать" из гл. 6), то такую процедуру можно рассматривать как составную часть обрабатывающей структуры прикладной программы. Пролог, расширенный за счет таких процедур, будет более мощным вычислительным формализмом, чем Пролог сам но себе, потому что при наличии данных процедур можно будет описывать более сложные системы при помощи чисто декларативных фраз языка Пролог.

Следовательно, на третьей стадии изучения языка Пролог программист должен усвоить некоторую дисциплину при программировании, заключающуюся в том, что для сохранения чисто описательного характера программного текста, ориентированного на конкретное применение, необходимо сводить все побочные эффекты в процедуры общего назначения. Итак, в тех случаях, когда вычислительный формализм Пролога не представляется адекватным для описания некоторой программной ситуации (или для представления системы), всегда существует выбор между ухудшением свойств формализма за счет добавления побочных эффектов к фразам, ориентированным на конкретное применение, и расширением формализма посредством написания процедур общего назначения. В нижеследующих двух правилах хорошего стиля программирования на Прологе поощряется выбор второй альтернативы.

Соседние файлы в папке Гл.6,7,Прилож.,Допол