Como implementar programas interativos (como jogos / simulações) usando programação lógica?


20

Ouvi dizer que a programação lógica pode servir como uma alternativa de uso geral a outros paradigmas de programação, como OO ou programação funcional. (Como o Prolog está completo com Turing, deve ser assim!)

No entanto, estou tendo problemas para ver como seria possível implementar um programa interativo, como um jogo gráfico simples de console no Prolog ou um idioma semelhante. Você tem fatos, regras que podem derivar mais fatos e consultas que recuperam fatos. É fácil ver como você pode usar esses elementos básicos para criar algo como um solucionador de sudoku. Mas e o Pac-man, ou mais simplesmente, Pong?

ATENÇÃO: Não estou procurando detalhes de baixo nível, mas uma visão geral conceitual. (Por exemplo: em termos de alto nível, como você lida com a E / S? Como você armazena o estado do jogo? Como você implementa algo como um "loop principal"? Como você mede e responde à passagem do tempo? )


1
Eu realmente gosto da sua pergunta - fui ensinado a Prolog há muito tempo e me fiz a mesma pergunta e nunca consegui pensar em uma maneira de fazer isso.
Christian Sauer

Eu pessoalmente conduzi um curso de programação lógica implementando um clone Frozen Bubbles no SWI Prolog. Funcionou como um encanto (depois do décimo dia, a produtividade diminuiu porque apenas jogar era mais divertido do que adicionar funcionalidade). O link do site uni está quebrado, mas tentarei verificar se posso disponibilizar o código novamente.
Kilian Foth 08/08

2
"Como o Prolog está completo com Turing, deve ser assim!" - Na verdade não. Prolog sendo Turing-completo significa que qualquer função matemática em números naturais que pode ser calculada por uma Máquina de Turing pode ser calculada por Prolog. Mas isso não diz nada sobre algoritmos que não são funções matemáticas em números naturais. Por exemplo: um sistema operacional é uma função matemática em números naturais? Um servidor web? Um jogo? Imprimir no console? Dirigindo um robô? Não tenho dúvidas de que tudo isso pode ser feito no Prolog, mas isso não significa necessariamente que o Prolog esteja completo com Turing.
Jörg W Mittag

@ JörgWMittag: Em outras palavras, pode ser possível, apenas pode não ser prático?
9263 Robert Harvey

1
@ JörgWMittag - Sim, todos eles, no fundo, são apenas matemática e armazenamento em números.
Bobson

Respostas:


9

O rastreamento do estado do jogo não é diferente do rastreamento do estado em qualquer outro programa Prolog. Você define fatos e os usa para tomar decisões. É bem antigo, mas o artigo Explorando Prolog: Aventuras, Objetos, Animais e Impostos explica bem como isso pode funcionar em um jogo. Resumido do artigo:

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

Além disso, você precisa de uma biblioteca de gráficos e E / S. Pode haver distribuições comerciais do Prolog que as incluam. Estou mais familiarizado com o SWI Prolog , por isso vou sugerir o plOpenGL como ponto de partida. Além de fornecer acesso aos recursos de renderização do OpenGL, também inclui ligações para eventos de mouse e teclado. Por exemplo, para pressionar uma tecla Escape, defina uma regra do teclado da seguinte maneira:

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

Veja o exemplo de luz móvel do plOpenGL para mais alguns detalhes e um exemplo de como lidar com o movimento do mouse.

Se você usar uma biblioteca de gráficos, ela provavelmente lidará com o ciclo do jogo para você. Basicamente, você inverte o controle na biblioteca e fornece regras a serem executadas quando apropriado: configurar, repintar, eventos de E / S, etc. Se você deseja limitar o FPS ou executar o código condicionalmente com base no tempo, pode rastrear o tempo decorrido usando hora / data predicados e tomar decisões em conformidade.

Existem muitos sabores de Prolog, portanto essa certamente não é a única maneira de criar um jogo. Distribuições diferentes e idiomas relacionados usarão bibliotecas / ligações diferentes que podem incentivar abordagens diferentes. Além disso, os programadores poliglotas podem incentivá-lo a usar um idioma / tempo de execução mais "amigável aos gráficos" para gerenciar a renderização e a IO enquanto usa o Prolog para modelar comportamentos e tomadas de decisão de entidades do jogo.


1
O mesmo site ao qual você se vinculou também contém um tutorial mais longo, Adventure in Prolog , que eu achei útil e que também termina no desenvolvimento de um simples jogo de aventura baseado em texto.
JSCs

Ótimo! Era isso que eu estava procurando. Eu sinto que incluir operações com efeitos colaterais (como write) em um "predicado lógico" parece distorcer bastante o conceito.
Alex D

2

Sobre a resposta de Corbin : Em geral, o estado pode ser armazenado / recuperado no Prolog usando os predicados assert / retrair. Mas existem muitas opções não padronizadas, como salvar em RDF, XML, bancos de dados relacionais, etc. Se você deseja GUI, um exemplo é o XPCE oferecido pelo SWI-Prolog.

Observe que, embora a implementação de um jogo completo na Programação Lógica seja um bom exercício, na prática seu desempenho seria inadequado e é por isso que fornecedores como o SWI-Prolog oferecem ligações a linguagens de nível inferior (por exemplo, Java, C ++ etc.). Mesmo a implementação de um simples solucionador de Sudoku requer o uso de bibliotecas CLP .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.