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.
logic
data-structure
puzzle
taseriano
fonte
fonte
Respostas:
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:
Então você tem instâncias das categorias:
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
POSITION
manuseio 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.
fonte
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.
fonte
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
Rule
classe. 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.
fonte
Rule
turma é uma boa ideia. Modelar essas restrições ainda é feito pela lógica de predicados, eu acho.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.
fonte
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'.
fonte