Пролог, проваливай и не возвращайся - PullRequest
4 голосов
/ 23 мая 2010

Есть ли в SWI-Prolog какой-либо встроенный предикат, который всегда будет давать сбой И мешать машине вернуться назад - это остановит выполнение программы немедленно (это не то, что делает fail/0)? Я мог бы использовать порезы, но они мне не нравятся.

Делать что-то вроде !, fail не проблема для меня, но для достижения того, что я хочу, мне придется использовать разрезы в большем количестве мест, а это то, что мне не нравится.

Ответы [ 4 ]

7 голосов
/ 24 мая 2010

Вы можете использовать исключения.Исходя из вашего вопроса - это должно помочь.Ссылка ссылка

4 голосов
/ 23 мая 2010

Вы могли бы использовать механизм, явно разработанный, чтобы помочь вам чего-то достичь, но вам это не нравится?

Вы всегда можете использовать not, что является синтаксическим сахаром для сбой резки

3 голосов
/ 24 мая 2010

На ум приходят две альтернативы:

  1. Передайте термин backtrack(true) или backtrack(false) через код, которым вы хотите управлять, и интерпретируйте его в определении предикатов, которые вы пишете, чтобы быстро потерпеть неудачу, если он установлен на backtrack(false), или продолжить если backtrack(true). Обратите внимание, что это на самом деле не помешает возврату; он должен просто включить fast-fail . Даже если ваше дерево проверок является глубоким, это должно обеспечить быстрый способ предотвратить выполнение определенного кода при возврате.
  2. Используйте исключения, как предложено @Xonix (+1). Создание исключения немедленно прервет построение дерева проверки, и вы можете передать любые данные терминов через исключение до обработчика, минуя еще одно выполнение - это, вероятно, будет быстрее, чем первый вариант, но может быть не так переносимо.

Лично я использовал оба метода раньше - первый, где я предвидел необходимость до написания кода, последний, где я этого не делал.

2 голосов
/ 23 мая 2010

Жаль, для этого и нужны сокращения.

...