Парадигмы | Логика ограничений , декларативная |
---|---|
Разработано | Том Фрювирт |
Впервые появился | 1991 ( 1991 ) |
Веб-сайт | правила-обработки-ограничений.org |
Под влиянием | |
Пролог |
Правила обработки ограничений ( CHR ) — декларативный язык программирования на основе правил , представленный в 1991 году Томом Фрювиртом в то время в Европейском исследовательском центре компьютерной промышленности (ECRC) в Мюнхене, Германия. [1] [2] Первоначально предназначенный для программирования ограничений , CHR находит применение в индукции грамматики , [3] системах типов , [4] абдуктивных рассуждениях , многоагентных системах , обработке естественного языка , компиляции , планировании , пространственно-временных рассуждениях , тестировании и верификации .
Программа CHR, иногда называемая обработчиком ограничений , представляет собой набор правил, которые поддерживают хранилище ограничений , мультимножество логических формул. Выполнение правил может добавлять или удалять формулы из хранилища, тем самым изменяя состояние программы. Порядок, в котором правила «срабатывают» в данном хранилище ограничений, является недетерминированным , [5] согласно его абстрактной семантике и детерминированным (применение правил сверху вниз), согласно его уточненной семантике . [6]
Хотя CHR является полным по Тьюрингу , [7] он обычно не используется как язык программирования сам по себе. Скорее, он используется для расширения основного языка с ограничениями. Prolog на сегодняшний день является самым популярным основным языком, и CHR включен в несколько реализаций Prolog, включая SICStus и SWI-Prolog , хотя реализации CHR также существуют для Haskell , [8] Java , C , [9] SQL , [10] и JavaScript. [11] В отличие от Prolog, правила CHR являются многоголовыми и выполняются в манере обязательного выбора с использованием алгоритма прямой цепочки .
Конкретный синтаксис программ CHR зависит от языка хоста, и на самом деле программы встраивают операторы в язык хоста, которые выполняются для обработки некоторых правил. Язык хоста предоставляет структуру данных для представления терминов , включая логические переменные. Термины представляют ограничения, которые можно рассматривать как «факты» о проблемной области программы. Традиционно в качестве языка хоста используется Prolog, поэтому используются его структуры данных и переменные. Остальная часть этого раздела использует нейтральную математическую нотацию, которая распространена в литературе по CHR.
Программа CHR, таким образом, состоит из правил, которые манипулируют множественным набором этих терминов, называемым хранилищем ограничений . Правила бывают трех типов: [5]
Поскольку правила упрощения включают упрощение и распространение, все правила CHR следуют формату
где каждый из является конъюнкцией ограничений: и содержат ограничения CHR, в то время как охранники встроены. Только один из должен быть непустым.
Хост-язык также должен определять встроенные ограничения для терминов. Охранники в правилах являются встроенными ограничениями, поэтому они эффективно выполняют код хост-языка. Теория встроенных ограничений должна включать по крайней мере true
(ограничение, которое всегда выполняется), fail
(ограничение, которое никогда не выполняется и используется для сигнализации об отказе) и равенство терминов, т. е. унификацию . [7] Если хост-язык не поддерживает эти функции, они должны быть реализованы вместе с CHR. [9]
Выполнение программы CHR начинается с начального хранилища ограничений. Затем программа продолжает сопоставлять правила с хранилищем и применять их, пока не будет больше совпадений правил (успех) или fail
не будет получено ограничение. В первом случае хранилище ограничений может быть считано программой на хост-языке для поиска интересующих фактов. Сопоставление определяется как «односторонняя унификация»: оно связывает переменные только с одной стороны уравнения. Сопоставление с образцом может быть легко реализовано, когда как унификация поддерживается хост-языком. [9]
Следующая программа CHR в синтаксисе Prolog содержит четыре правила, которые реализуют решатель для ограничения «меньше или равно» . Правила помечены для удобства (метки необязательны в CHR).
% X leq Y означает, что переменная X меньше или равна переменной Y рефлексивность @ X leq X <=> true . антисимметрия @ X leq Y , Y leq X <=> X = Y . транзитивность @ X leq Y , Y leq Z ==> X leq Z . идемпотентность @ X leq Y \ X leq Y <=> true .
Правила можно читать двумя способами. В декларативном прочтении три правила определяют аксиомы частичного порядка :
Все три правила неявно универсально квантифицированы (идентификаторы в верхнем регистре являются переменными в синтаксисе Пролога). Правило идемпотентности является тавтологией с логической точки зрения, но имеет цель во втором чтении программы.
Второй способ прочитать вышеизложенное — это компьютерная программа для поддержки хранилища ограничений, набора фактов (ограничений) об объектах. Хранилище ограничений не является частью этой программы, но должно поставляться отдельно. Правила выражают следующие правила вычислений:
Учитывая запрос
А, В, С, С, А
могут произойти следующие преобразования:
Текущие ограничения | Правило, применимое к ограничениям | Вывод из применения правила |
---|---|---|
A leq B, B leq C, C leq A | транзитивность | A leq C |
A leq B, B leq C, C leq A, A leq C | антисимметрия | A = C |
A leq B, B leq A, A = C | антисимметрия | A = B |
A = B, A = C | никто |
Правило транзитивности добавляет A leq C
. Затем, применяя правило антисимметрии , A leq C
и C leq A
удаляются и заменяются на A = C
. Теперь правило антисимметрии становится применимым к первым двум ограничениям исходного запроса. Теперь все ограничения CHR устранены, поэтому никакие дальнейшие правила не могут быть применены, и A = B, A = C
возвращается ответ: CHR правильно вывел, что все три переменные должны ссылаться на один и тот же объект.
Чтобы решить, какое правило должно «сработать» на данном хранилище ограничений, реализация CHR должна использовать некоторый алгоритм сопоставления шаблонов . Алгоритмы-кандидаты включают RETE и TREAT, [12] но большинство реализаций используют ленивый алгоритм, называемый LEAPS . [13]
Первоначальная спецификация семантики CHR была полностью недетерминированной, но так называемая «усовершенствованная семантика операций» Дака и др. устранила большую часть недетерминизма, так что разработчики приложений могут полагаться на порядок выполнения для производительности и правильности своих программ. [5] [14]
Большинство приложений CHR требуют, чтобы процесс переписывания был конфлюэнтным ; в противном случае результаты поиска удовлетворяющего назначения будут недетерминированными и непредсказуемыми. Установление конфлюэнтности обычно осуществляется с помощью следующих трех свойств: [2]