Сначала терминологическая проблема: ни 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