Введение

Язык логического программирования с ограничениями, работающий параллельно

Constraint Handling Rules (CHR) — это декларативный язык программирования, основанный на правилах, разработанный в 1991 году Томом Фрюхвиртом в Европейском исследовательском центре компьютерной промышленности (ECRC) в Мюнхене, Германия. Изначально предназначенный для программирования с ограничениями, CHR находит применение в грамматической индукции, типовых системах, абдуктивном рассуждении, многоагентных системах, обработке естественного языка, компиляции, планировании, пространственно-временном рассуждении, тестировании и верификации. Программа CHR, иногда называемая обработчиком ограничений, представляет собой набор правил, поддерживающих хранилище ограничений — мультимножество логических формул. Выполнение правил может добавлять или удалять формулы из хранилища, тем самым изменяя состояние программы. Порядок, в котором правила "активируются" для данного хранилища ограничений, является недетерминированным согласно своей абстрактной семантике и детерминированным (применение правил сверху вниз) согласно своей уточненной семантике. Хотя CHR является Тьюринг-полным, он редко используется как самостоятельный язык программирования. Скорее, он применяется для расширения языка-хоста возможностями работы с ограничениями. Prolog является наиболее популярным языком-хостом, и CHR включен в несколько реализаций Prolog, таких как SICStus и SWI-Prolog, хотя реализации CHR также существуют для Haskell, Java, C, SQL и JavaScript. В отличие от Prolog, правила CHR многоголовы и выполняются с фиксированным выбором, используя алгоритм прямого распространения.

Обзор языков

Конкретный синтаксис программ CHR зависит от языка-хоста, и на самом деле программы встраивают в язык-хост операторы, которые выполняются для обработки некоторых правил. Язык-хост предоставляет структуру данных для представления термов, включая логические переменные. Термы представляют собой ограничения, которые можно рассматривать как «факты» о проблемной области программы. Традиционно в качестве языка-хоста используется Prolog, поэтому используются его структуры данных и переменные. В остальной части этого раздела используется нейтральная математическая нотация, общепринятая в литературе по CHR. Таким образом, программа CHR состоит из правил, которые манипулируют мульти-множеством этих термов, называемым хранилищем ограничений. Правила бывают трех типов: но большинство реализаций используют ленивый алгоритм, называемый LEAPS. Изначальная спецификация семантики CHR была полностью недетерминированной, но так называемая «уточнённая операционная семантика» Duck и др. устранила большую часть недетерминизма, чтобы разработчики приложений могли полагаться на порядок выполнения для производительности и корректности своих программ. Большинство приложений CHR требуют, чтобы процесс переписывания был конфлюэнтным; в противном случае результаты поиска удовлетворяющего назначения будут недетерминированными и непредсказуемыми. Установление конфлюэнтности обычно осуществляется посредством следующих трех свойств:

Программа CHR является локально конфлюэнтной, если все её критические пары объединимы. Программа CHR называется завершающейся, если в ней нет бесконечных вычислений. Завершающаяся программа CHR является конфлюэнтной, если все её критические пары объединимы.