Охранные оговорки в прологе?

Они существуют? Как они реализованы?

Предикаты сопрограммы SWI-Prolog (freeze, when, dif и т. Д. .) имеют функциональные возможности охранников. Как они вписываются в предпочтительный стиль программирования на Прологе?

Я очень новичок в логическом программировании (с Prolog и вообще) и несколько смущен тем фактом, что он не является чисто декларативным и требует процедурных соображений даже в очень простых случаях (см. Это вопрос об использовании \== или dif). Я упустил что-то важное?


person Community    schedule 07.12.2012    source источник
comment
Как указано ниже редактором false ниже, термин "охрана" здесь неправильный, поскольку "охрана" используется для обозначения стандарта болота предварительное условие, например в выражении "если-то". Правильный - это охраняемая подвеска. Надеюсь. Тем не менее, я оставил исходную формулировку как охранник в вопросе.   -  person David Tonhofer    schedule 02.01.2015
comment
С помощью математики вы можете безопасно заморозить / 2, см. Здесь: stackoverflow.com/a/35688017/502187   -  person Mostowski Collapse    schedule 29.02.2016


Ответы (3)


Сначала терминологическая проблема: ни freeze/2, ни when/2, ни dif/2 не называются охранниками ни при каких обстоятельствах. Охранники появляются в таких расширениях, как CHR, или связанных языках как GHC (ссылка на японском языке) или другой Языки параллельного логического программирования; вы даже (при определенных ограничениях) можете рассматривать пункты формы

Начальник :- Страж_5 _...

as предложения, содержащие охрану и разрез, в этом случае скорее будут называться фиксацией. Но ни один из них не относится к вышеперечисленным примитивам. Охранники скорее вдохновлены охраняемым командным языком Дейкстры 1975 года.

freeze(X, Goal) (первоначально назывался geler) совпадает с when(nonvar(X), Goal), и оба они декларативно эквивалентны Goal. К функциональности гвардейцев прямого отношения не имеет. Однако при использовании вместе с if-then-else вы можете реализовать такую ​​защиту. Но это совсем другое.

freeze/2 и подобные конструкции в течение некоторого времени рассматривались как общий способ улучшить механизм выполнения Prolog. Однако они оказались очень хрупкими в использовании. Часто они были слишком консервативны, из-за чего без надобности откладывали голы. То есть почти каждый интересный запрос давал «неустойчивый» ответ, как в запросе ниже. Кроме того, граница между завершающимися и незавершенными программами теперь намного сложнее. Для чисто монотонных программ Prolog, которые завершаются, добавление некоторой конечной цели в программу сохранит завершение всей программы. Однако с freeze/2 это уже не так. Затем с концептуальной точки зрения freeze/2 не очень хорошо поддерживался верхними уровнями систем: только несколько систем показывали отложенные цели комплексным образом (например, SICStus), что имеет решающее значение для понимания разницы между успехом / ответами и решением. С отложенными целями Prolog теперь может дать ответ, который не имеет решения, как этот:

?- freeze(X, X = 1), freeze(X, X = 2).
freeze(X, X=1),
freeze(X, X=2).

Еще одна трудность с freeze/2 заключалась в том, что условия завершения намного труднее определить. Таким образом, хотя freeze должен был решить все проблемы с прерыванием, он часто создавал новые проблемы.

Есть также и другие технические трудности, связанные с freeze/2, в частности со столами и другими методами предотвращения зацикливания. Рассмотрим ясно цель freeze(X, Y = 1), Y теперь 1, даже если она еще не связана, она все еще ожидает X, чтобы ее связали первой. Теперь реализация может рассмотреть возможность попадания в таблицу для достижения цели g(Y). g(Y) теперь либо не будет решения, либо будет ровно одно решение Y = 1. Этот результат теперь будет сохранен как единственное решение для g/1, поскольку freeze-цель не была напрямую видна цели.

Именно по этим причинам freeze/2 считается отправной точкой программирования логики ограничений.

Другой проблемой является dif/2, который сегодня считается ограничением. В отличие от freeze/2 и других примитивов сопрограммы, ограничения гораздо лучше способны управлять согласованностью, а также поддерживать гораздо лучшие свойства завершения. Это в первую очередь связано с тем, что ограничения вводят четко определенный язык, в котором могут быть доказаны конкретные свойства и разработаны конкретные алгоритмы, которые не позволяют достичь общих целей. Однако даже для них можно получить ответы, которые не являются решениями. Подробнее об ответах и ​​успехах в CLP.

person false    schedule 08.12.2012
comment
Боюсь, еще больше путаницы в терминологии. За пределами вселенной Пролога охранники - это охранники: предварительные условия, используемые Дейкстрой, логическое выражение, которое принимает значение true или false и используется для декларативного указания потока управления. «Стражи» GHC и GDC и Parlog являются частями тел статей, которые приостанавливают выполнение основных целей пока не будет выполнено условие, подобное заголовкам правил производственной системы. Звучит очень похоже на «замораживание / 2» (сопрограммы, не так ли?), Меньше на Дейкстру. - person David Tonhofer; 03.01.2015
comment
@DavidTonhofer: Ключ в том, что они, очень похожие на охранников Дейкстрена, только если-то. Больше нет. Если охранники накладываются друг на друга, тогда выбор делается в случайном / хронологическом порядке с возвратом. Таким образом, вы не можете выразить отрицание как неудачу с охраной. - person false; 03.01.2015
comment
Подробнее о GHC / GDC, в частности об истории, читайте в главе 3 (Метаморфозы) Агентно-ориентированное программирование - от пролога к защищенным определенным предложениям, конспект лекции в книге Springer по информатике, который также можно получить ... другими способами. Однако он был написан довольно быстро и содержит ряд технических ошибок и запутанных формулировок. Тем не менее оно того стоит. - person David Tonhofer; 03.01.2015
comment
Разве они не больше похожи, как только ... тогда? Поток управления исходит из большого мешка с доступными потоками в небе (в отличие от охранников Дейкстры, у которых есть только поток потоков). Погодите, а что будет при возврате из-за зависания? От него никогда не избавиться, так как условие, которого он ожидает, может стать истинным позже. Или я здесь неправильно понимаю семантику? Мне нужна бумажная справка. - person David Tonhofer; 03.01.2015
comment
если, когда, ... Я бы сказал, что изучение этого направления вам не очень поможет. Параллельный Пролог и ему подобные близки к Прологу, но не совсем. Единственный текущий язык, использующий это в некоторой степени, - это CHR. - person false; 03.01.2015

freeze / 2 и when / 2 похожи на «goto» логического программирования. Они не чистые, не коммутативные и т. Д.

Dif / 2, с другой стороны, является полностью чистым и декларативным, монотонным, коммутативным и т.д. Что касается «предпочтительного стиля программирования на Прологе»: укажите, что имеет место. Если вы хотите выразить ограничение, заключающееся в том, что два общих термина различны, это именно то, что заявляет diff / 2.

Процедурные соображения обычно наиболее необходимы, когда вы не программируете в чистом декларативном подмножестве Пролога, но используете нечистые предикаты, которые не являются коммутативными и т. Д. В современных системах Пролога нет особых причин когда-либо оставлять чистое и декларативное подмножество.

person mat    schedule 07.12.2012
comment
Что вы имеете в виду под коммутативным? Вы можете привести пример? - person false; 08.12.2012
comment
Я думал об общем случае: поскольку замораживание / 2 и когда / 2 не накладывают ограничений на их второй аргумент, вы можете, например, даже использовать их для вывода, где порядок целей имеет значение. - person mat; 08.12.2012
comment
freeze / 2 - это переход к программированию логики ограничений; но явно не логического программирования. - person false; 09.12.2012
comment
Да, логического программирования ограничений. Ясно, что мы еще не достаточно фрагментированы. - person mat; 09.12.2012
comment
@mat В современных системах Prolog нет особых причин когда-либо отказываться от чистого декларативного подмножества. Безапелляционное утверждение, мой добрый друг. Я бы сказал, что наши интерпретаторы редко работают снизу вверх (возможно, Starlog? Datalog точно) и мы требуем побочных эффектов, чтобы не скатиться к солипсизму! - person David Tonhofer; 02.01.2015
comment
Всегда стремитесь к чистоте. Например, для чтения файлов используйте чистый ввод с library(pio) Ульриха Ноймеркеля. Чтобы распечатать вещи, используйте встроенную возможность верхнего уровня отображать решения. Сосредоточьтесь на четком декларативном описании с использованием ограничений, и вы получите более общие программы, которые можно использовать в большем количестве направлений. - person mat; 05.01.2015

Есть статья Эвана Тика, объясняющая CC:

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

РАЗВИТИЕ СОВМЕСТНЫХ ЯЗЫКОВ ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ
Эван Тик - 1995
https://core.ac.uk/download/pdf/82787481.pdf

Так что я предполагаю, что с помощью некоторой магии when / 2 код фиксированного выбора можно переписать в обычный Пролог. Подход будет следующий. Для набора фиксированных правил выбора одного и того же предиката:

H1 :- G1 | B1.
...
H2 :- Gn | Bn.

Это можно переписать следующим образом, где Hi 'и Gi' должны реализовать пассивное объединение. Например, используя исправление ISO subsumes_term / 2.

H1' :- G1', !, B1.
..
H1' :- Gn', !, Bn.
H :- term_variables(H, L), when_nonvar(L, H).

Вышеупомянутый перевод не будет работать для CHR, поскольку CHR не выбрасывает кандидатов.

person Mostowski Collapse    schedule 04.11.2018