Lógica Declarativa em Python

python
0 – Python
11 – Logica (limitada)
11.1 – pyDatalog
11.2 – SymPy (lógica simbólica)
11.3 – Simulação com regras (ex: regras de negócio)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Python vai além da lógica booleana tradicional. Bibliotecas como pyDatalog e SymPy expandem esse horizonte. Primeiramente, pyDatalog implementa programação lógica. Ela é inspirada em Prolog para Python puro. SymPy é uma biblioteca de matemática simbólica. Ambas permitem simular sistemas baseados em regras. Por exemplo, regras de negócio podem ser formalizadas. Isso é útil para sistemas especialistas e inferência. Além disso, a simulação com regras é declarativa. Você descreve o que o sistema deve fazer, não como. Portanto, essas ferramentas elevam o nível de abstração. Assim, problemas complexos se tornam mais tratáveis.

pyDatalog: programação lógica em Python

pyDatalog adiciona fatos e regras a programas Python. Um fato é uma afirmação verdadeira sobre o mundo. Por exemplo, “pai(jose, ana)” significa que José é pai de Ana. Uma regra define relacionamentos condicionais. Por exemplo, “avô(X, Z) :- pai(X, Y), pai(Y, Z)”. Isso significa: X é avô de Z se X é pai de Y e Y é pai de Z. Primeiramente, instale com pip install pyDatalog. As consultas retornam todas as soluções possíveis. Isso foi inspirado em bancos de dados dedutivos. Consequentemente, você faz perguntas complexas declarativamente. Use pyDatalog para sistemas de recomendação. Também para validação de regras de negócio. Portanto, é uma ferramenta poderosa para lógica simbólica.

Uma fórmula que representa uma regra pyDatalog é:

\(\text{Conclusão} \leftarrow \text{Condição}_1 \land \text{Condição}_2 \land \dots\)
Isso significa que a conclusão é verdadeira se todas as condições forem verdadeiras. Além disso, pyDatalog suporta agregações e aritmética. No entanto, a performance pode cair para fatos muito grandes. Use para conjuntos de dados pequenos ou médios. Portanto, avalie o tamanho do seu domínio antes.

SymPy: matemática simbólica e lógica formal

SymPy manipula expressões matemáticas simbolicamente. Ela resolve equações, simplifica termos e calcula derivadas. Além disso, SymPy possui módulo de lógica proposicional. Você pode criar símbolos lógicos e avaliar expressões. Por exemplo, And(x, Or(y, z)) representa uma fórmula. Use satisfiable() para encontrar valores que a tornam verdadeira. Isso foi projetado para verificação de tautologias. Primeiramente, instale com pip install sympy. SymPy também resolve quantificadores lógicos. Por exemplo, “existe um x tal que P(x) é verdadeiro”. Use para sistemas de verificação formal. Também para provadores de teoremas educacionais. Portanto, SymPy é uma ferramenta acadêmica robusta.

Outra aplicação é a simulação com restrições. Defina regras de negócio como equações matemáticas. SymPy resolve sistemas de inequações automaticamente. Isso foi usado em planejamento financeiro e logística. Por exemplo, “orçamento < custo_total + margem”. A biblioteca encontra os valores que satisfazem as restrições. Assim, você automatiza decisões complexas. Portanto, SymPy vai além da matemática pura.

Quando usar cada ferramenta na simulação de regras

Use pyDatalog para relações hierárquicas e recursivas. Árvores genealógicas, grafos e sistemas de permissões são ideais. Também use para motores de inferência simples. Por outro lado, use SymPy para restrições numéricas. Regras de preços, descontos e impostos se encaixam. Além disso, use SymPy quando precisar de provas formais. Para sistemas mistos, combine ambas as bibliotecas. Primeiramente, modele as regras em linguagem natural. Depois, traduza para fatos pyDatalog ou equações SymPy. Isso facilita a validação com stakeholders de negócio. Evite pyDatalog para cálculos numéricos intensivos. SymPy não é otimizada para milhões de fatos. Portanto, escolha a ferramenta adequada ao seu problema.

Outro bom uso é para simulação de cenários de negócio. Por exemplo, regras de aprovação de crédito. “Cliente aprovado se renda > 2000 e sem restrições”. Você implementa como regras declarativas. Depois, testa diferentes combinações de entradas. Isso foi adotado em fintechs e seguradoras. Portanto, essas ferramentas são práticas e relevantes.

Exemplo prático: sistema de regras com pyDatalog e SymPy

O código abaixo demonstra ambas as bibliotecas. Primeiro, um sistema de parentesco com pyDatalog. Definimos fatos sobre uma família típica. Regras definem avô, irmão e tio. Depois, consultamos relações interessantes. Em seguida, usamos SymPy para lógica proposicional. Criamos símbolos para variáveis lógicas. Avaliamos expressões e verificamos consistência. Por fim, um sistema de restrições financeiras. Resolvemos inequações para encontrar valores permitidos. Observe como a lógica declarativa simplifica a tarefa. Vamos ao código comentado para detalhes.

Nos exemplos, a abordagem declarativa é evidenciada. pyDatalog resolve relações recursivas com facilidade. Apenas declaramos fatos e regras. O motor de inferência encontra as respostas automaticamente. SymPy, por outro lado, manipula símbolos matematicamente. As regras de negócio são expressas como inequações. O sistema encontra os valores que as satisfazem. Primeiramente, modele seu domínio como fatos ou equações. Depois, deixe a biblioteca fazer as deduções. Isso reduz drasticamente a complexidade do código imperativo. Além disso, a manutenção das regras se torna mais simples. Portanto, para problemas com muitas regras, vale o esforço.

Outro ponto importante é a documentação das regras. Regras declarativas são quase linguagem natural. Stakeholders de negócio podem validá-las diretamente. Isso foi um diferencial em projetos de sucesso. Para sistemas maiores, combine pyDatalog com bancos de dados. SymPy integra-se bem com pandas para análise numérica. Porém, o desempenho tem seus limites inevitáveis. Para milhões de fatos ou equações, considere outras soluções. Nesses casos, use bancos de dados gráficos ou solvers dedicados. Primeiramente, prototipe com Python para validar a lógica. Depois, escale para soluções mais robustas se necessário. Assim, você ganha agilidade sem comprometer qualidade.

📌 Resumo das ferramentas:
✅ pyDatalog: relações lógicas, árvores, sistemas especialistas
✅ SymPy: matemática simbólica, restrições, lógica formal
✅ Combinação: regras mistas (relações + matemática)

Finalmente, experimente criar seu próprio sistema de regras. Comece com um domínio pequeno, como aprovação de empréstimos. Ou implemente um sistema de recomendação de filmes. Use pyDatalog para relações de gêneros e atores. Use SymPy para calcular notas e preferências. A combinação delas é extremamente poderosa. Portanto, essas bibliotecas merecem seu estudo. Instale e brinque com os exemplos fornecidos. Você descobrirá novas formas de resolver problemas. Assim, seu repertório técnico se expande significativamente.

Expressões Regulares (Regex): Padrões para Buscar Texto

python

Expressões regulares são padrões usados para buscar texto. Elas permitem encontrar, extrair e substituir substrings. Primeiramente, dominar regex é uma habilidade valiosa. Com poucos símbolos, fazemos buscas complexas. Por exemplo, \d{3}-\d{3} encontra formatos como “123-456”. Sem regex, isso exigiria várias linhas de código. Além disso, regex funciona em muitas linguagens. Python, JavaScript, Java e PHP suportam o mesmo padrão. Portanto, o conhecimento é portável entre ecossistemas. No Python, usamos o módulo re nativo. Assim, você pode validar emails, CPFs, telefones e mais. Essa ferramenta foi projetada para eficiência e precisão.

Características fundamentais das expressões regulares

Uma regex é construída com metacaracteres especiais. O ponto (.) significa qualquer caractere (exceto quebra). O asterisco (*) repete o padrão zero ou mais vezes. O mais (+) repete uma ou mais vezes. A interrogação (?) torna algo opcional. Colchetes [abc] indicam “um destes caracteres”. Barras invertidas criam classes como \d (dígitos) ou \w (letras/números). Isso foi inspirado na teoria de linguagens formais. Uma fórmula que representa uma regex básica é:

\(\text{Padrão} = [a-zA-Z0-9][\text{metacaracteres}]\)

Primeiramente, comece com padrões simples. Depois, adicione complexidade gradualmente. Teste sempre com ferramentas online como regex101.com. Assim, você evita frustrações comuns no aprendizado.

Outra característica importante são os grupos e capturas. Parênteses () agrupam partes do padrão. Eles também capturam o texto correspondente. Você pode referenciar grupos por números ou nomes. Isso é útil para extrair partes específicas de um texto. Por exemplo, capturar dia, mês e ano de uma data. Consequentemente, você processa dados estruturados dentro de texto bruto.

Metacaracteres mais úteis e suas funções

Os metacaracteres são o coração das expressões regulares. O símbolo ^ ancora no início da string. O símbolo $ ancora no final da string. A barra vertical | funciona como OU lógico. Por exemplo, gato|cão encontra qualquer um deles. Colchetes com hífen criam intervalos: [a-z] são letras minúsculas. O metacaractere \b indica borda de palavra. Isso é útil para buscar palavras inteiras, não substrings. Além disso, \B é o oposto (não borda). Quantificadores como {n,m} controlam repetições exatas. Por exemplo, \d{2,4} encontra 2 a 4 dígitos. Portanto, dominar esses símbolos é fundamental.

Outro grupo importante são os atalhos pré-definidos. \D corresponde a qualquer não-dígito. \W corresponde a qualquer não-letra/número. \S corresponde a qualquer não-espaço. Eles são úteis para negar classes de caracteres. Por exemplo, \D+ captura tudo que não é número. Use esses atalhos para limpar dados rapidamente. Isso foi projetado para tornar regex mais legível. Primeiramente, decore os atalhos mais comuns. Depois, use tabelas de consulta para os raros. Assim, você escreve padrões mais expressivos.

Quando utilizar expressões regulares no dia a dia

Use regex para validação de formatos conhecidos. E-mails, URLs, placas de carro e CPF são exemplos. Também são ótimas para substituições complexas em massa. Por exemplo, trocar todos os números de telefone em um texto. Outro bom uso é para extração de dados em logs. Arquivos de servidor ou sistemas legacy são ideais. Além disso, regex ajuda na limpeza de dados textuais. Por outro lado, evite regex para HTML ou XML aninhados. Esses formatos não são regulares (contexto livre). Use parsers dedicados como BeautifulSoup nesses casos. Primeiramente, avalie se o padrão é linear. Se for, regex é sua melhor ferramenta. Portanto, regex é poderosa, mas não para tudo.

Outro bom uso é na busca dentro de editores de texto. VS Code, Sublime e Vim suportam regex nas buscas. Isso acelera drasticamente refatorações de código. Use também em pipelines de processamento de dados. Apache Spark e Pandas aceitam regex para filtros. Isso foi amplamente adotado na engenharia de dados. Portanto, regex é um curinga para muitos problemas.

Boas práticas e armadilhas comuns

Sempre use strings raw r"..." para evitar escapes duplicados. Isso torna a regex muito mais legível e segura. Outra boa prática é compilar padrões reutilizáveis com re.compile(). Isso melhora a performance em loops grandes. Além disso, comente regexes complexas com detalhes. Use o modo verbose (re.VERBOSE) para isso. Ele permite espaços e comentários dentro do padrão. Uma armadilha comum é o greedy vs non-greedy. Por padrão, quantificadores capturam o máximo possível. Use *? ou +? para captura mínima (lazy). Isso foi projetado para evitar capturar mais do que se deseja. Portanto, teste sempre com vários casos de borda.

Outra armadilha é esquecer de escapar caracteres literais. Ponto, colchetes, parênteses e asterisco precisam de \. Esqueça isso e sua regex terá comportamento inesperado. Além disso, evite regex excessivamente longas e aninhadas. Elas são difíceis de depurar e manter no futuro. Primeiramente, divida problemas complexos em etapas menores. Use variáveis para construir padrões aos poucos. Teste cada parte separadamente antes de combinar. Assim, você mantém a sanidade mental do programador. Portanto, documente e teste suas expressões regulares sempre.

Exemplo prático: validação e extração com re

O código abaixo demonstra os principais usos do módulo re. Primeiro, validamos formatos comuns como e-mail e telefone. Depois, extraímos partes específicas de um texto. Também mostramos substituições em massa expressivas. Usamos também flags para buscas case-insensitive. Por fim, otimizamos padrões com compilação prévia. Observe como poucas linhas resolvem problemas complexos. Sem regex, o mesmo código teria muitas condições. Vamos ao código comentado com vários exemplos práticos.

Os exemplos mostram a versatilidade das expressões regulares. Com poucas linhas, resolvemos problemas complexos. Primeiramente, note os padrões com metacaracteres \d e \w. Eles simplificam muito a escrita das regexes. Além disso, as flags como re.IGNORECASE aumentam a flexibilidade. A compilação prévia com re.compile() melhora a performance. Isso é útil quando o mesmo padrão é usado várias vezes. Para validações em formulários, use re.match() ou re.fullmatch(). Para extrações repetidas, finditer() é mais eficiente. Portanto, escolha a função certa para cada tarefa. Isso foi pensado para otimizar o uso de memória e tempo.

Outro ponto crucial é o tratamento de caracteres especiais. Pontos, colchetes e parênteses precisam de escape com barra invertida. Por exemplo, \. busca um ponto literal. Esqueça isso e sua regex terá comportamento inesperado. Além disso, evite regex excessivamente longas. Elas são difíceis de depurar e manter. Primeiramente, divida problemas complexos em etapas. Use variáveis para construir padrões aos poucos. Comente suas regexes com detalhes significativos. No Python, use strings raw r"..." para evitar escapes duplicados. Assim, você mantém a sanidade mental do programador. Portanto, documente suas expressões regulares sempre.

📌 Metacaracteres mais comuns (resumo rápido):
. – qualquer caractere
\d – dígito (0-9)
\w – letra, número ou _
\s – espaço, tab ou quebra
^ – início da string
$ – fim da string
* – zero ou mais
+ – um ou mais
? – zero ou um
{n,m} – entre n e m vezes

Finalmente, lembre-se dos limites das expressões regulares. Elas não conseguem contar parênteses aninhados corretamente. Também falham em linguagens com palavras balanceadas. Para esses casos, use analisadores sintáticos específicos. Um exemplo clássico é HTML dentro de HTML. Regex não é a ferramenta correta para isso. Portanto, conheça o domínio do seu problema. Use regex para padrões regulares (daí o nome). Isso foi estabelecido pela teoria da computação. Respeite esses limites e você será bem-sucedido. Assim, regex será uma aliada, não uma dor de cabeça.

LinkedIn
Share
Instagram