Неужели это плохо в программировании?
Эй, ребята, в этом семестре я прохожу курс ИИ, на котором мы изучаем Пролог. Наш лектор сказал нам, чтобы мы старались избегать использования сокращений в нашем задании, однако, по паре вопросов я не могу их избежать. Мне просто любопытно, почему порезы считаются грехом (слова лекторов)? Я понимаю, что это своего рода короткий путь, но я использовал их, точно зная, как они влияют на мою программу.
Благодарю.
2 ответа
Я согласен с @dasblinkenlight и @mbratch. Кроме того, я думаю, что полезно думать с точки зрения зеленых порезов и красных порезов.
Зеленый вырез - это тот, который не влияет на логическое поведение программы, а только на производительность. Для вас это способ сказать Прологу, что вы знаете, что если он продолжит развиваться, он не принесет никаких плодов. Зеленые срезы никогда не нужны- они просто улучшают производительность. Когда вы только начинаете изучать Пролог, есть еще много всего, с чем вы можете справиться, просто кажется, что это добавляет дополнительную сложность за небольшую выгоду.
Красный вырез действительно влияет на поведение программы. Как сказал @mbratch, новые пользователи часто бросают сокращения, чтобы "привести в порядок" вывод. Новые пользователи часто рассматривают запрос Prolog как пользовательский интерфейс для своей программы. Эти сокращения делают их предикаты менее общими и менее полезными в процессе улучшения выходных данных. Есть также несколько альтернатив, которые являются более понятными, как once/1
который дает вам единственный результат. Эксперты очень деликатно используют красные срезы - бывают ситуации, когда это гораздо эффективнее, чем логический подход, но если у вас есть доступ к чисто логической формулировке, это предпочтительнее. Часто предикаты с ошибками в использовании cut имеют проблемы с "обратной корректностью", которые возникают позже, когда вы зависите от предиката как части других предикатов. Это может быть трудно отладить и исправить.
Я не уверен, что назвал бы их "грехом", но я в основном согласен с вашим профессором для начинающих. Лучше всего, если у вас есть опыт логического решения проблем без использования разреза. Затем разрез может быть введен позже, когда вы лучше поймете, что легко, а что сложно. Слишком раннее его использование заставляет вас зависеть от него как опоры для процедурного программирования.
Вначале попробуйте сосредоточиться на чисто декларативной части Пролога по простой причине: именно эта часть отличает Пролог от других языков программирования. Сосредоточьтесь на чистой, монотонной части языка и полностью избегайте сокращений. Как еще можно ожидать, что вы погрузитесь в эту парадигму программирования?
Тем не менее, вы наверняка столкнетесь с определенными проблемами. В частности, при попытке кодировать конструкции if-then-else и общее отрицание. Когда условие для такой конструкции должно быть выполнено успешно для части if и должно произойти сбой для части then, вы попадаете в немонотонный код. Тем не менее, Prolog никогда не был построен для обработки такого кода в чистом виде
Вместо этого Пролог знает только правила "если тогда". По сути, у вас будет одно правило для одной части, а другое - для другой. Вначале это будет выглядеть довольно необычно, но позволяет вам получить очень чистый код.
Смотрите false для примеров чистого кода.
Смотрите также: Особенности хорошего кода Пролога? Забавно, что интересные вопросы всегда закрываются на ТАК.
Для зеленых или красных порезов просто принимайте как должное, что зеленых порезов почти нет. Поскольку, если вы хотите использовать разрезы безопасным способом, вам придется добавить дополнительные условия ("охранники"), которые не имеют никакого смысла в противном случае. Это действительно что-то для оптимизаторов, авторов компиляторов и тому подобное.
Чтобы мой ответ был немного более сбалансированным, вот пример чистого способа повысить эффективность с помощью cut: