Как реализовать интерактивные программы (например, игры / симуляции) с использованием логического программирования?

20

Я слышал, что логическое программирование может служить альтернативой общего назначения другим парадигмам программирования, таким как ОО или функциональное программирование. (Поскольку Пролог завершен по Тьюрингу, это должно быть так!)

Тем не менее, я не могу понять, как можно реализовать интерактивную программу, например, простую графическую консольную игру на Прологе или похожий язык. У вас есть факты, правила, которые могут получить больше фактов, и запросы, которые извлекают факты. Легко увидеть, как вы можете использовать эти базовые элементы для создания чего-то вроде решателя судоку. Но как насчет Pac-Man или, проще говоря, Pong?

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: я не ищу детали низкого уровня, но концептуальный обзор. (Например: в терминах высокого уровня, как бы вы справились с вводом / выводом? Как бы вы сохранили состояние игры? Как бы вы реализовали что-то вроде «основного цикла»? Как бы вы измерили и отреагировали на течение времени? )

Алекс Д
источник
1
Мне очень нравится твой вопрос - я долго думал о Прологе, задавал себе тот же вопрос и никогда не мог придумать, как это сделать.
Кристиан Зауэр
Я лично провел курс по логическому программированию, реализуя клон Frozen Bubbles в SWI Prolog. Работал как шарм (после десятого дня производительность пошла на спад, потому что просто играть было веселее, чем добавлять функциональность). Ссылка на унифицированный сайт не работает, но я постараюсь узнать, смогу ли я снова сделать код доступным.
Килиан Фот
2
"Поскольку Пролог завершен по Тьюрингу, это должно быть так!" - На самом деле, нет. Пролог, являющийся полным по Тьюрингу, означает, что любая математическая функция на натуральных числах, которая может быть вычислена машиной Тьюринга, может быть вычислена Прологом. Но это ничего не говорит об алгоритмах, которые не являются математическими функциями на натуральных числах. Например: является ли операционная система математической функцией от натуральных чисел? Веб-сервер? Игра? Печать на консоль? Вождение робота? Я не сомневаюсь, что все это может быть сделано в Прологе, но это не обязательно следует из Пролога, являющегося полным по Тьюрингу.
Йорг Миттаг
@ JörgWMittag: Другими словами, это может быть возможно, просто не может быть практичным?
Роберт Харви
1
@ JörgWMittag - Да, все они, по сути, просто математика и хранение цифр.
Бобсон

Ответы:

9

Состояние отслеживания игры ничем не отличается от состояния отслеживания в любой другой программе Prolog. Вы определяете факты, а затем используете их для принятия решений. Она довольно старая, но статья « Изучение пролога: приключения, предметы, животные и налоги» хорошо объясняет, как это может работать в игре. Подведены итоги из статьи:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

Кроме того, вам нужна библиотека графики и ввода-вывода. Там могут быть коммерческие дистрибутивы Пролог, которые включают их. Я наиболее знаком с SWI Prolog , поэтому в качестве отправной точки я предложу plOpenGL . Он не только дает вам доступ к возможностям рендеринга OpenGL, но также включает привязки для событий мыши и клавиатуры. Например, чтобы обрабатывать нажатие клавиши Escape, вы определяете правило клавиатуры следующим образом:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

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

Если вы используете графическую библиотеку, она, скорее всего, будет обрабатывать игровой цикл для вас. По сути, вы инвертируете управление библиотекой и предоставляете правила, которые должны выполняться при необходимости: настройка, перерисовка, события ввода-вывода и т. Д. Если вы хотите ограничить FPS или выполнить код условно на основе времени, вы можете отслеживать истекшее время, используя время / дату предикаты и принимать решения соответственно.

Существует множество разновидностей Prolog, так что это, конечно, не единственный способ создать игру. Различные дистрибутивы и связанные языки будут использовать разные библиотеки / привязки, которые могут поощрять разные подходы. Кроме того, программисты полиглотов могут рекомендовать вам использовать более «дружественный к графике» основной язык / среду выполнения для управления рендерингом и вводом-выводом при использовании Prolog для моделирования поведения игровых объектов и принятия решений.

Корбин Март
источник
1
На том же сайте, на который вы ссылаетесь, также есть более длинное руководство Adventure in Prolog , которое мне показалось полезным и которое также заканчивается разработкой простой текстовой приключенческой игры.
ОАО
Большой! Это то, что я искал. Я чувствую, что включение операций с побочными эффектами (вроде write) в «логический предикат», кажется, довольно далеко отходит от концепции.
Alex D
2

В верхней части ответа Корбина : в общем случае состояние может быть сохранено / восстановлено в Прологе с использованием предикатов assert / retract. Но есть много нестандартных опций, таких как сохранение в RDF, XML, реляционные базы данных и т. Д. Если вам нужен графический интерфейс, одним из примеров является XPCE, предлагаемый SWI-Prolog.

Обратите внимание, что хотя реализация полноценной игры в логическом программировании является хорошим упражнением, на практике ее производительность будет неадекватной, и поэтому производители, такие как SWI-Prolog, предлагают привязки к языкам более низкого уровня (например, Java, C ++ и т. Д.). Даже реализация простого решения судоку требует использования библиотек CLP .

sakisk
источник