предыдущая серия:
Программирование в ограничениях
В этой парадигме мы пытаемся запрограммировать решение через математический подход, называемый задача удовлетворения ограничений (constraint satisfaction problem, CSP). Имеется заданный набор хорошо определённых переменных, и набор ограничений (логических отношений) на эти переменные, после чего автоматически находятся значения этих переменных, удовлетворяющие всем ограничениям.
Эта парадигма наиболее декларативная из всех практических парадигм программирования. Программист определяет желаемый результат, и система (обычно это так называемый солвер, решатель) сама его ищет, причём решение может быть подчас совершенно неожиданным для программиста.
Программирование в ограничениях находится на гораздо более высоком уровне абстракции, чем все остальные парадигмы. Во-первых, ограничения могут налагать на проблему глобальное условие: а что вообще есть истинное решение. Во-вторых, решение чаще всего находится в разумные сроки, потому что солверы используют весьма сложные, продуктивные и хорошо отработанные алгоритмы поиска.
Программирование в ограничениями сильно отличается от других парадигм. Вместо того, чтобы писать набор инструкций, которые должны быть исполнены, программист моделирует проблему: специфицирует условия задачи с помощью переменных подходящих типов, задаёт их формально в виде ограничений на значения переменных, и подбирает подходящие методы анализа ограничений и стратегии поиска решения.
Небольшие задачи решаются легко, однако когда система большая, модель и эвристики решения надо подбирать и проектировать с большой осторожностью, чтобы максимально сократить поиск за счет продуктивного использования структуры модели, иначе решение может не найтись, или будет искаться слишком долго. Искусство программирования в ограничениях заключается по сути в таком проектирование модели, которое делает сложные проблемы контролируемыми и доступными для автоматического анализа. В значительной степени мощь данной парадигмы зависит от выразительности самого языка CSP-солвера и и от его "умности" и способности эффективно ограничивать пространство поиска.
Этой теме посвящён мой отдельный курс по солверу Microsoft Z3.
Программирование в ограничениях тесно связано с декларативным параллелизмом. Семантически они принадлежат параллельному программированию в ограничениях. Как и декларативный параллелизм, программирование в ограничениях будет детерминированным: для заданного входа вычисляется детерминированное выходное значение. От декларативного параллелизма оно отличается двумя моментами. Во-первых, вместо переменных dataflow (например, X=V) вводится общее ограничение "X должно равняться V". Во-вторых, каждое ограничение может анализироваться ("вычисляться") в отдельной нити, что позволяет выделить его в полностью автономный параллельный агент.
Заключение
На этом мы закончили самое начальное, поверхностное и предварительное изучение принципов и парадигм программирования, необходимых для того, чтобы понять в программировании всё.
Более глубоким изучением этого всего на практике занимаемся на моих соответствующих курсах.