Я слышал, что логическое программирование может служить альтернативой общего назначения другим парадигмам программирования, таким как ОО или функциональное программирование. (Поскольку Пролог завершен по Тьюрингу, это должно быть так!)
Тем не менее, я не могу понять, как можно реализовать интерактивную программу, например, простую графическую консольную игру на Прологе или похожий язык. У вас есть факты, правила, которые могут получить больше фактов, и запросы, которые извлекают факты. Легко увидеть, как вы можете использовать эти базовые элементы для создания чего-то вроде решателя судоку. Но как насчет Pac-Man или, проще говоря, Pong?
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: я не ищу детали низкого уровня, но концептуальный обзор. (Например: в терминах высокого уровня, как бы вы справились с вводом / выводом? Как бы вы сохранили состояние игры? Как бы вы реализовали что-то вроде «основного цикла»? Как бы вы измерили и отреагировали на течение времени? )
источник
Ответы:
Состояние отслеживания игры ничем не отличается от состояния отслеживания в любой другой программе Prolog. Вы определяете факты, а затем используете их для принятия решений. Она довольно старая, но статья « Изучение пролога: приключения, предметы, животные и налоги» хорошо объясняет, как это может работать в игре. Подведены итоги из статьи:
Кроме того, вам нужна библиотека графики и ввода-вывода. Там могут быть коммерческие дистрибутивы Пролог, которые включают их. Я наиболее знаком с SWI Prolog , поэтому в качестве отправной точки я предложу plOpenGL . Он не только дает вам доступ к возможностям рендеринга OpenGL, но также включает привязки для событий мыши и клавиатуры. Например, чтобы обрабатывать нажатие клавиши Escape, вы определяете правило клавиатуры следующим образом:
Взгляните на пример движущегося источника света plOpenGL, чтобы узнать больше подробностей и пример обработки движения мыши.
Если вы используете графическую библиотеку, она, скорее всего, будет обрабатывать игровой цикл для вас. По сути, вы инвертируете управление библиотекой и предоставляете правила, которые должны выполняться при необходимости: настройка, перерисовка, события ввода-вывода и т. Д. Если вы хотите ограничить FPS или выполнить код условно на основе времени, вы можете отслеживать истекшее время, используя время / дату предикаты и принимать решения соответственно.
Существует множество разновидностей Prolog, так что это, конечно, не единственный способ создать игру. Различные дистрибутивы и связанные языки будут использовать разные библиотеки / привязки, которые могут поощрять разные подходы. Кроме того, программисты полиглотов могут рекомендовать вам использовать более «дружественный к графике» основной язык / среду выполнения для управления рендерингом и вводом-выводом при использовании Prolog для моделирования поведения игровых объектов и принятия решений.
источник
write
) в «логический предикат», кажется, довольно далеко отходит от концепции.В верхней части ответа Корбина : в общем случае состояние может быть сохранено / восстановлено в Прологе с использованием предикатов assert / retract. Но есть много нестандартных опций, таких как сохранение в RDF, XML, реляционные базы данных и т. Д. Если вам нужен графический интерфейс, одним из примеров является XPCE, предлагаемый SWI-Prolog.
Обратите внимание, что хотя реализация полноценной игры в логическом программировании является хорошим упражнением, на практике ее производительность будет неадекватной, и поэтому производители, такие как SWI-Prolog, предлагают привязки к языкам более низкого уровня (например, Java, C ++ и т. Д.). Даже реализация простого решения судоку требует использования библиотек CLP .
источник