Estruturas de dados para jogos lógicos / Regras de dedução / Conjunto suficiente de pistas?

11

Eu tenho pensado em desenvolver um jogo de lógica semelhante ao quebra-cabeça de Einstein , que teria diferentes conjuntos de pistas para cada nova repetição de jogo.

Quais estruturas de dados você usaria para lidar com as diferentes entidades (animais de estimação, cores de casas, nacionalidades etc.), regras de dedução etc. para garantir que as dicas fornecidas apontem para uma solução única?

Estou com dificuldade para pensar em como obter as regras de dedução para acompanhar as possíveis pistas; qualquer insight seria apreciado.

taseriano
fonte
1
Eu não acho que seria muito interessante jogar. Depois de resolvê-lo uma vez , fazê-lo novamente com regras diferentes não seria muito diferente de jogar sudoku.
o0 '.
4
Por outro lado, as pessoas fazem centenas de sudoku antes de se cansarem. E se você amarrar as respostas a algum tipo de ação no mundo, em vez de apenas digitar um número ou nome, as pessoas nem sequer reclamarão que é sudoku.
Isso me lembra do jogo: nick.com/games/series.html
Ceejay
3
Eu sugeriria dar uma olhada nos jogos de Everett Kaser - ele fez uma tonelada de jogos dessa natureza, em particular Sherlock, que foi inspirado por esse mesmo quebra-cabeça, mas também por outros jogos, como Honeycomb Hotel ou seu último jogo. , Sra Hudson . Pode ajudar você a ver esse tipo de coisa em ação.
Michael Madsen
@ Joe: o que você diz é tecnicamente certo, mas o importante aqui é saber o que você está fazendo (ele está). Fazer um jogo semelhante ao sudoku é bom se você estiver ciente de que está fazendo isso, enquanto quase certamente levará a resultados ruins se você acha que está fazendo outra coisa.
o0 '.

Respostas:

4

Uau. Na verdade, isso parece uma situação em que as redes semânticas de IA da velha escola, como Richard Bartle pensavam que seriam importantes para o futuro dos jogos quando ele escreveu Inteligência Artificial e Jogos de Computador , seriam úteis. Você basicamente tem algumas listas de dados (tabelas de banco de dados, o que for), a primeira especifica regras sobre como as coisas podem se relacionar, como:

a PERSON must LIVE IN a DOMICILE
a PERSON must OWN an ANIMAL
a PERSON must DRINK a BEVERAGE
a PERSON must SMOKE a CIGARETTE BRAND
a PERSON must BE OF a NATIONALITY
a DOMICILE must BE IN a POSITION
a DOMICILE must BE OF a COLOR

Então você tem instâncias das categorias:

ANIMAL: dog snail zebra fox horse
BEVERAGE: milk tea OJ coffee water
CIGARETTE BRAND: Kools Parliaments Luckies OldGold Chesterfields
NATIONALITY: Englishman Spaniard Ukrainian Japanese Norwegian
POSITION: first second third fourth fifth
COLOR: red green yellow ivory blue

Essas estruturas de dados não encapsulam completamente a situação - você precisa das restrições de exclusividade e algumas das categorias precisam de meta-regras, como o POSITIONmanuseio de "à direita de", "à esquerda de" e "próximo para "conceitos, por exemplo - mas a estrutura do problema parece sugeri-los fortemente.

Não sei se isso vai levá-lo muito longe, mas espero que ajude.

caos
fonte
4

Minha recomendação é examinar o código Python para problemas de satisfação com restrições (CSPs) fornecido com o projeto AIMA . Eles usam um dicionário (matriz associativa / tabela de hash) para acompanhar as restrições válidas. Além disso, existem implementações de vários algoritmos usados ​​para resolver CSPs, como min-conflitos e AC3.

O código inclui um exemplo de problema da Zebra como exemplo, como o que você vinculou.

Brandon
fonte
1

Isso é muito profundo, na verdade. Estranho que a Wikipedia nunca a mencione.

O que você está procurando são provas muito concretas que podem, provavelmente, ser alcançadas com coisas como provas da Fitch . Então, estamos tentando deduzir coisas de nossos dados. Existem muitos construtores à prova de Fitch que fazem muito trabalho para você. Mas alguns exercícios não são apenas para prova.

Não sei se o usuário deve fazer os cálculos. Nesse caso, esteja ciente de coisas como 3SAT , que são problemas que podem ser desfeitos por tempo polinomial.

Quanto às estruturas de dados que você deseja usar, acho que você deseja ter algum tipo de Ruleclasse. A regra pode ser qualquer coisa, dependendo do tipo. Não há muitas regras no lógica de predicados , portanto, isso pode ser superado pela herança (if, iff, e, or, not ...). Essas regras só precisam ser avaliadas. E a única coisa que uma regra pode fazer é retornar verdadeiro ou falso. Porque é isso que você faz com lógicas predicadas. Na universidade, fui recomendado a ler este livro por John Kelly .

Voltando às aulas: Você verá esses problemas como implementaria cálculos normais com matemática. O que é um +operador? Ele contém dois parâmetros, que podem ser uma nova equação por si só ou apenas um número. Eu acho que você tem o mesmo com as regras. Eles podem ter novas regras como parâmetro ou apenas um booleano (o chamado predicado).

Espero que isso ajude muito, principalmente as referências. Se você quiser saber mais, ou se estou indo na direção errada, por favor me diga.

Marnix
fonte
O problema não é simplesmente provas na lógica de predicados sobre um modelo finito (e minúsculo!), Ou eu teria respondido em vez de pagar uma recompensa. O objetivo não é resolver o problema - o objetivo é fazer o problema automaticamente e de uma maneira interessante.
@ Joe O problema, mesmo para um pequeno conjunto, ainda seria o problema da 3SAT. Se você apenas criar ANDs e ORs, isso pode levar a coisas que não são satisfatórias, então acho que seria muito difícil gerar um quebra-cabeça aleatório. O quebra-cabeça deve conter pelo menos algumas restrições. Às vezes, o raciocínio contrário poderá ser a resposta (tenho uma solução, deixar as coisas fora)
Marnix
A lógica geral de predicados é realmente mais difícil que o 3SAT; no entanto, algoritmos de prova modernos são realmente muito bons na prática. Além disso, basta gerar um modelo, um quebra-cabeça e verificar uma solução em tempo linear - o truque é garantir que as restrições fornecidas produzam uma solução única e detectável.
@ Joe, então há alguma restrição sobre a qual podemos criar esse quebra-cabeça? A questão ainda era: qual estrutura de dados usar. Então ainda acho que a Ruleturma é uma boa ideia. Modelar essas restrições ainda é feito pela lógica de predicados, eu acho.
Marnix
0

Não tenho uma boa resposta, mas procurando dicas sobre o mesmo tipo de problema, encontrei este repositório no github:

https://github.com/nateinaction/Zebra-Puzzle

Ele contém algumas lógicas para selecionar pistas e decidir quantas pistas você precisaria para tornar o quebra-cabeça solucionável.

Vegar
fonte
-1

Há isso em resolvê-lo.

Claro, acho que não seria muito difícil trabalhar para trás; ou seja, tem uma lista como esta:

  • Fred Red Dog

  • Steve Blue Cat

  • Bill Purple Whale

  • Eric Cyan Dolphin

O que poderia ser facilmente gerado e, a partir daí, criar um conjunto de regras.

Quanto ao armazenamento, por que não um conjunto de cada coisa separada, então [Fred, Steve, Bill, Eric] e um conjunto de respostas [Fred, Red, Dog]. Em seguida, tenha 'NAME (NÃO) ACTION OBJECT'.

Quando você se dedica a isso, uma solução única realmente importa? Contanto que seu jogo possa dividi-los nas listas e marque 'o conjunto 1 não contém baleia'.

O Pato Comunista
fonte
2
O truque é que você deseja que o problema ainda seja difícil. Se as regras que você gera admitem 90% das combinações possíveis como respostas válidas, não é mais um quebra-cabeça interessante.
Acho que esse é um ponto válido - mas a solução não é apenas diminuir o número de pistas fornecidas?
O pato comunista
1
Não. É mais provável que a subespecificação leve a muitas conclusões válidas. A superespecificação provavelmente levará a uma conclusão muito óbvia. Um bom quebra-cabeça lógico evita ambos.
Ah, sim, eu senti falta disso de alguma forma. Vou tentar adicionar uma solução melhor se conseguir pensar em uma.
O pato comunista
Joe: Exatamente certo com seu primeiro comentário. Um quebra-cabeça que permite que você colete pistas, quer ou não, não é tanto um quebra-cabeça quanto um projeto de arte do jardim de infância.
Taserian