Як реалізувати інтерактивні програми (наприклад, ігри / симуляції) за допомогою логічного програмування?


20

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

Однак у мене виникають труднощі бачити, як можна було б реалізувати інтерактивну програму, наприклад, просту гральну графічну консоль у Prolog чи подібну мову. У вас є факти, правила, які можуть отримати більше фактів, і запити, які отримують факти. Неважко зрозуміти, як можна використовувати ці основні елементи, щоб створити щось на зразок вирішувача судоку. Але як щодо Пак-чоловіка, чи простіше кажучи, Понга?

УВАГА! Примітка. Я шукаю не деталі низького рівня, а концептуальний огляд. (Наприклад: в умовах високого рівня, як би ви обробляли введення-виведення? Як би ви зберігали стан гри? Як би ви реалізували щось на кшталт "основного циклу"? Як би ви оцінювали та реагували на проходження часу? )


1
Мені дуже подобається ваше запитання - я давно обманув Пролога і задав собі те саме запитання, і ніколи не міг придумати спосіб зробити це.
Крістіан Зауер

Я особисто провів курс логічного програмування, реалізуючи клон Frozen Bubbles у SWI Prolog. Працював як шарм (після десятого дня продуктивність знизилася, тому що просто грати було веселіше, ніж додавати функціональність). Посилання на веб-сайт uni розірвано, але я спробую перевірити, чи зможу я знову зробити код доступним.
Кіліан Фот

2
"Оскільки Пролог є Тюрінгом, це повинно бути так!" - Не зовсім. Пролог, який є Тьюрінгом, означає, що будь-яка математична функція на натуральних числах, яка може бути обчислена машиною Тюрінга, може бути обчислена Прологом. Але це нічого не говорить про алгоритми, які не є математичними функціями в натуральних числах. Наприклад: чи є операційна система математичною функцією на натуральних числах? Веб-сервер? Гра? Друк на консоль? Керування роботом? Я не сумніваюся, що все це можна зробити в Prolog, але це не обов'язково випливає з того, що Prolog є повним Turing.
Йорг W Міттаг

@ 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.

Крім того, вам потрібна бібліотека графіки та IO. Можуть бути комерційні дистрибутиви Prolog, які включають їх. Мені найбільше знайомий SWI Prolog , тому я пропоную plOpenGL як вихідну точку. Він не тільки надає вам доступ до можливостей візуалізації OpenGL, але також включає прив’язки для подій миші та клавіатури. Наприклад, для обробки натискання клавіші Escape, ви визначаєте правило клавіатури так:

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

Погляньте на приклад рухомого світла plOpenGL для ще декількох деталей та приклад керування рухом миші.

Якщо ви користуєтеся графічною бібліотекою, вона, ймовірно, обробляє ігровий цикл для вас. В основному ви інвертуєте управління в бібліотеку і надаєте правила, які потрібно виконувати, коли це доречно: налаштування, перефарбовування, події вводу-виводу тощо. Якщо ви хочете обмежити FPS або запустити код умовно залежно від часу, ви можете відстежувати минулий час, використовуючи час / дату предикати і відповідно приймати рішення.

Існує багато ароматів Prolog, тому це, звичайно, не єдиний спосіб побудувати гру. Різні дистрибутиви та суміжні мови використовуватимуть різні бібліотеки / прив’язки, що може заохочувати різні підходи. Крім того, програмісти поліглотів можуть заохочувати вас використовувати більш "графічний" мову хоста / час виконання для управління візуалізацією та IO, використовуючи Prolog для моделювання поведінки суб'єктів ігор та прийняття рішень.


1
Цей самий сайт, на який ви пов’язали, також містить довший підручник « Пригоди в Пролозі» , який я вважав корисним, а також закінчується розробкою простої текстової пригодницької гри.
jscs

Чудово! Це те, що я шукав. Я відчуваю, що включення операцій з побічними ефектами (на кшталт write) у "логічний предикат", здається, нав'язує концепцію досить далеко.
Алекс Д

2

Зверху на відповідь Корбіна : Загалом стан може зберігатися / витягуватися в Prolog, використовуючи предикати затвердження / відкликання. Але є багато нестандартних варіантів, таких як збереження в RDF, XML, реляційні бази даних тощо. Якщо ви хочете GUI, одним із прикладів є XPCE, запропонований SWI-Prolog.

Зауважте, що хоча реалізація повноцінної гри в логічному програмуванні є хорошою вправою, на практиці її ефективність буде недостатньою, і тому такі постачальники, як SWI-Prolog, пропонують прив'язку до мов нижчого рівня (наприклад, Java, C ++ тощо). Навіть реалізація простого вирішувача судоку вимагає використання бібліотек CLP .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.