2 pontos por GN⁺ 2024-02-22 | 1 comentários | Compartilhar no WhatsApp

Recursos quase mágicos da linguagem de programação Picat

  • Picat é uma linguagem de pesquisa que busca combinar programação lógica, programação imperativa e resolução de restrições.
  • O módulo planner do Picat é um dos modelos de programação mais interessantes existentes.

Explicação rápida sobre programação lógica

  • Em programação imperativa e funcional, escreve-se um algoritmo que recebe uma entrada e gera uma saída.
  • Em programação lógica e resolução de restrições, fornece-se um conjunto de equações e busca-se uma atribuição que satisfaça essas relações.

Definição do problema

  • O problema consiste em mover um marcador em uma grade do ponto inicial (origem) até uma coordenada de destino.
  • Em cada passo, pode-se mover uma célula para cima, baixo, esquerda ou direita, sem sair dos limites da grade.
  • O programa tem sucesso quando o marcador está na coordenada de destino.

Primeira implementação

  • Você deve fornecer um estado inicial Start, uma sequência de funções action que representam transições de estado e uma função final(S) que determina os estados finais.
  • Ao chamar best_plan(Start, Plan), a sequência de menor número de etapas necessária para alcançar um estado final é atribuída a Plan.

Adicionando vários objetivos

  • O planejador precisa atingir todos os objetivos em ordem.
  • Adiciona-se uma nova função action que remove o objetivo atingido da fila.

Minimização de custo

  • Visitar os objetivos na ordem em que aparecem nem sempre significa o menor caminho total.
  • Se você quiser encontrar o menor caminho independentemente da ordem dos objetivos, altere action para que o planejador escolha o próximo objetivo minimizando o comprimento total do caminho.

Outras variações

  • Picat oferece muitas variações de planejamento.
  • best_plan(S, Limit, Plan) impõe um custo máximo igual a Limit.
  • sequence(P, Action) limita as ações possíveis com base no plano parcial atual.

Vale a pena usar Picat?

  • Picat é uma linguagem de pesquisa e carece de conveniência, como boa documentação ou mensagens de erro claras.
  • Picat é mais útil como uma linguagem de "ferramenta" para resolver problemas computacionais específicos.

Apêndice: outras linguagens de planejamento

  • O planejamento foi desenvolvido para robótica e IA, mas hoje é usado principalmente em IA de videogames como Goal-Oriented Action Planning (GOAP).
  • PDDL é uma linguagem de descrição de planejamento usada como entrada por um planejador independente.

Opinião da GN⁺

  • Inovação no modelo de programação: O módulo planner de Picat adiciona uma nova dimensão à programação. Isso é especialmente poderoso ao lidar com problemas como busca de caminhos complexos.
  • Valor educacional: Picat é importante do ponto de vista educacional de programação. Ele pode ajudar a aprender conceitos de programação lógica e resolução de restrições.
  • Resolução de problemas específicos: Picat é útil como linguagem-ferramenta para resolver problemas computacionais específicos. Ele oferece uma nova abordagem para problemas que são difíceis de resolver com linguagens de programação tradicionais.

1 comentários

 
GN⁺ 2024-02-22
Discussão no Hacker News
  • Caso real de uso do modo de planejamento do Picat no trabalho

    • Desenvolvimento de um protótipo de sistema para manutenção de equipamentos
    • Dizer ao sistema o que fazer, em vez de como fazer
    • O plano ótimo foi gerado com Picat, mas surgiram problemas ao escalar para um volume maior
    • Como o planejamento é EXPTIME, a escalabilidade teve limite, como esperado
    • Mesmo com definição de heurística, classificador Naive Bayes e restrições de simetria, ainda houve muita necessidade de manutenção
    • Na área clássica de GOFAI, ainda é um "inverno da IA"
  • Informações sobre recursos e exemplos de Picat

    • No site de Hakan Kjellerstrand, membro ativo da comunidade de programação por restrições, há materiais e exemplos de Picat
  • Recomendação de Prolog e MiniZinc

    • Prolog é uma linguagem madura e fácil de entender, com recurso de resolução de restrições
    • MiniZinc é uma interface para acesso a solvers especializados em objetivos diversos
    • Em Prolog, é preciso um bom entendimento para melhorar o desempenho
    • Foi recomendando considerar se algo escrito em Picat pode ser facilmente reescrito em outra linguagem depois
  • Comentário relacionado à entrevista técnica da Firebase

    • A entrevista técnica da Firebase seria mais fácil se fosse usada uma ferramenta como o Picat
    • Foi um prazer ver o Predrag aparecendo como revisor
  • Comparação entre tipos e linguagens de programação

    • Semelhante ao sistema de tipos do TypeScript, mas você precisa resolver por conta própria
    • O TypeScript não é suficientemente forte para expressar restrições
    • Enfatizou-se a simplicidade e facilidade do estilo de programação de planner
  • Menção ao GOAP (Goal-Oriented Action Planning)

    • GOAP usado no IA dos inimigos no jogo F.E.A.R., que acrescentou diversão
    • O paper de Jeff Orkin sobre GOAP foi considerado de leitura fácil e divertido
  • Avaliação da função planner do Picat

    • Picat é similar ao Prolog, mas com recurso de planner adicionado
    • Com recursos de planner, certos problemas podem ser resolvidos de forma simples, mas o desempenho ainda precisa ser comparado com programação imperativa
  • O sonho de informar ao computador o estado final e deixá-lo resolver

    • Geração de código e transições de estado usando o algoritmo A*
    • Pouca experiência com a comunidade de planejamento ou solvers, mas experimentou com ortools
    • Vê a programação de forma parecida com logística, comparando com um "quebra-cabeça deslizante"
  • Comentário adicional sobre sintaxe parecida com Prolog

    • Usa uma sintaxe semelhante ao Prolog e sugere terminar com true. como uma solução mais elegante do que comma first

Este resumo reflete opiniões de pessoas diferentes e transmite cada ponto de vista de forma neutra. O conteúdo técnico relacionado a linguagens de programação foi explicado de forma concisa para que engenheiros de software júnior possam entender com facilidade.