Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Жаль, что это то, что вырезывают.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top