Пролог, провалиться и не возвращайтесь
-
04-10-2019 - |
Вопрос
Есть ли построение предиката в Swi-Prolog, который всегда будет терпеть неудачу и предотвратить машину от backtracking - это прекратить программу немедленно выполнять (это не то, что fail/0
делает)? Я мог бы использовать порезы, но мне они не нравятся.
Делать что-то вроде !, fail
Это не проблема для меня, но для достижения того, что я хочу, мне придется использовать порезы в более местах, и это то, что мне не нравится.
Решение
Вы можете использовать исключения. На основании вашего вопроса - это должно помочь. Ссылаться связь
Другие советы
Вы можете использовать механизм, явно разработанный, чтобы помочь вам что-то сделать, но вам это не нравится?
Вы всегда можете использовать не так, что синтаксический сахар для сокращения
Две альтернативы приходят на ум:
- Пройти вокруг А.
backtrack(true)
илиbacktrack(false)
Термин через код, который вы хотите управлять, и интерпретировать его в определении предикатов, которые вы пишете, чтобы быстро провалиться, если он установлен наbacktrack(false)
, или продолжать, еслиbacktrack(true)
. Отказ Обратите внимание, что это на самом деле не предотвращает возвращение; Это должно просто включить быстрая неудача. Отказ Даже если ваше доказательство дерева глубоко, это должно обеспечить быстрый способ предотвращения выполнения определенного кода на обратную связь. - Используйте исключения, как предложено @xonix (+1). Бросив исключение немедленно прекращает конструкцию доказывания дерева.
Лично я использовал оба метода раньше - первое, где я ожидал необходимости, прежде чем написать код, последний, где у меня нет.
Жаль, что это то, что вырезывают.