Cтраница 1
Декларативный смысл касается только отношений, определенных в программе. [1]
Декларативный смысл программ на чистом Прологе не зависит от порядка предложений и от порядка целей в предложениях. [2]
Декларативный смысл программы определяет, является ли данная цель истинной ( достижимой) и, если да, при каких значениях переменных она достигается. [3]
Декларативный смысл логической программы определяет истинность Р вне зависимости от порядка обработки условий Q и R, так как все условия соединены логической операцией & и должны соблюдаться одновременно. [4]
Это предложение верно в декларативном смысле, но совершенно бесполезно в качестве рабочей программы. [5]
Это был пример программы, декларативный смысл которой трудно сформулировать. В то же время ее процедурный смысл совершенно ясен: чтобы вычислить куб, сначала нужно считать X, а затем его обработать; если X стоп, то все сделано, иначе вывести X и рекурсивно запустить процедуру куб для обработки остальных чисел. [6]
Напротив, отсечения, влияющие на декларативный смысл, называются красными. [7]
Причина, по которой не следует забывать о декларативном смысле, кроется в том, что прогресс, достигнутый в технологии программирования, получен на пути продвижения от учета всех процедурных деталей к концентрации внимания на декларативных аспектах, которые обычно легче формулировать и понимать. Сама система, а не программист, должна нести бремя заботы о процедурных деталях. В этом Пролог оказывает некоторую помощь, хотя, как мы видели в данном разделе, помощь лишь частичную: иногда он правильно прорабатывает эти процедурные детали, иногда - нет. Практическим следствием такого взгляда является тот факт, что часто довольно легко получить работающую программу, имея программу декларативно корректную. Поэтому практичным следует признать такой подход: сосредоточиться на декларативных аспектах задачи, затем пропустить на машине полученную программу и, если она окажется процедурно неправильной, попытаться изменить порядок следования предложений и целей. [8]
Первое, что нужно сделать при процедурном исследовании выполнения корректной в декларативном смысле процедуры, - это определить, наверняка ли вызов приведет к ее завершению. При использовании метода анализа состояний Вы не столкнетесь с проблемой зацикливания процесса, если поместите утверждения для базовых состояний перед рекурсивными утверждениями, а также если убедитесь, что рекурсивные состояния приближают процесс к базовому состоянию. Для примера рассмотрим процедуру для предиката младше по званию / 2, альтернативную той, что была дана в разд. [9]
Чтобы в декларативном языке можно было выполнять разумные вычисления, для него наряду с декларативным смыслом определяется интерпретация в виде действий, или процедурная семантика. Однако, для того чтобы писать программы, знать о ней необязательно. Эту ситуацию можно, пожалуй, сравнить с естественным языком, который мы понимаем и используем, хотя мы не знаем о действии физических процессов в нашем мозгу и ее понимаем логико-лингвистических процессов языка. [10]
В наших примерах из предыдущего раздела мы видели, что удаление отсечений из программы может привести к изменению ее декларативного смысла. [11]
Важно заметить, что в последней версии, в отличие от предыдущей, отсечения затрагивают не только процедурное поведение, но изменяют также и декларативный смысл программы. [12]
С точки зрения декларативного смысла это совершенно корректно, однако в процедурном смысле оно бесполезно. Более того, для пролог-системы такое предложение может породить серьезную проблему. [13]
Способность пролог-системы прорабатывать многие процедурные детали самостоятельно считается одним из специфических преимуществ Пролога. Это свойство побуждает программиста рассматривать декларативный смысл программы относительно независимо от ее процедурного смысла. Поскольку результаты работы программы в принципе определяются ее декларативным смыслом, последнего ( опять же в принципе) достаточно для написания программ. Этот факт имеет практическое значение, поскольку декларативные аспекты программы являются, обычно, более легкими для понимания, нежели процедурные детали. Чтобы извлечь из этого обстоятельства наибольшую пользу, программисту следует сосредоточиться главным образом на декларативном смысле и по возможности не отвлекаться на детали процесса вычислений. Последние следует в возможно большей мере предоставить самой пролог-системе. [14]
В предыдущем разделе было показано, что порядок целей и предложений имеет существенное значение. Более того, существуют программы, которые верны в декларативном смысле, но на практике не работают. Такое противоречие между декларативным и процедурным смыслами может вызвать недовольство. [15]