Métodos de Tomada de Decisão

A Lógica e seus Tipos — da Lógica Clássica à Lógica Fuzzy

Prof. Marcelo R.P. Ferreira

PPGMDS - UFPB - Programa de Pós-Graduação em Modelagem de Decisão e Saúde

julho, 2026

A Lógica e seus Tipos

“A lógica é a anatomia do pensamento.”

— John Locke

Mapa da Aula 2

A Lógica e seus Tipos Aula 2 — 14/07/2026 Bloco A Lógica Clássica e SE Bloco B Lógicas Não Clássicas Bloco C Lógica Fuzzy Proposições · Conectivos Sistemas Especialistas Modal · Temporal Não Monotônica Conjuntos · Pertinência Inferência Mamdani Aplicações em Triagem e Risco Clínico

Conexão com a Aula 1

  • Na Aula 1 vimos que SADs usam modelos para apoiar decisões
  • Os sistemas especialistas baseados em regras são um tipo clássico de SAD orientado a modelos
  • Essas regras seguem uma lógica formal — que é exatamente o que estudamos hoje
  • A lógica clássica diz respeito ao raciocínio preciso; a lógica fuzzy ao raciocínio impreciso
  • Na saúde, a maioria das informações é linguística e vaga: “febre alta”, “pressão elevada”, “dor moderada”

Conexão com a Aula 3: os sistemas de inferência fuzzy e os grafos de decisão que veremos hoje são a base conceitual para as redes bayesianas da próxima aula.

Bloco A — Lógica Clássica e Sistemas Especialistas

O que é Lógica?

  • Lógica é o estudo das formas corretas de raciocínio e inferência
  • Permite derivar conclusões válidas a partir de premissas dadas
  • Em computação e IA, a lógica fornece a linguagem para representar e manipular conhecimento
  • Tipos de lógica variam no que podem expressar e em como tratam a incerteza e a imprecisão
Tipo Lida com Exemplo em saúde
Clássica Verdadeiro ou falso “O paciente tem febre”
Modal Possibilidade, necessidade “É possível que seja pneumonia”
Fuzzy Graus de verdade “A febre é alta”
Probabilística Incerteza quantitativa “85% de chance de infecção”

Proposições e Valores de Verdade

  • Uma proposição (denotada por \(p\), \(q\), etc.) é uma sentença declarativa que pode ser verdadeira (V) ou falsa (F)
  • Não é uma pergunta, ordem ou exclamação
  • Exemplos de proposições:
    • “O paciente tem temperatura acima de 38°C” → V ou F
    • “A pressão sistólica é maior que 140 mmHg” → V ou F
  • Não são proposições:
    • “Qual é a saturação de O₂?” → pergunta
    • “A dor está melhorando” → vago (sem medida precisa)

A lógica clássica exige que toda afirmação seja precisamente V ou F — e é exatamente essa rigidez que a lógica fuzzy vai suavizar mais adiante.

Conectivos Lógicos

Sejam \(p\) e \(q\) proposições.

Conectivo Símbolo Nome Significado
Negação \(\neg p\) NÃO inverte o valor de \(p\)
Conjunção \(p \wedge q\) E V somente se ambos V
Disjunção \(p \vee q\) OU V se ao menos um V
OU exclusivo \(p \oplus q\) XOR V somente se exatamente um V
Condicional \(p \rightarrow q\) SE…ENTÃO F apenas se \(p\) V e \(q\) F
Bicondicional \(p \leftrightarrow q\) SE E SOMENTE SE V se ambos iguais

Exemplo clínico: “SE febre \(\wedge\) tosse \(\wedge\) dispneia ENTÃO suspeitar de pneumonia”

Conectivos Lógicos em R

Conectivo Símbolo R (vetores) R (if)
Negação \(\neg p\) !x !x
E \(p \wedge q\) x & y x && y
OU \(p \vee q\) x | y x || y
XOR \(p \oplus q\) xor(x,y) xor(x,y)

Importante

Use &/| para filtrar bancos de dados (vetorizado); &&/|| em condições de if (escalar).

Conectivos Lógicos em R

# SIRS: Síndrome da Resposta Inflamatória Sistêmica
febre       <- c(TRUE,  TRUE,  FALSE, TRUE,  FALSE)
taquicardia <- c(TRUE,  FALSE, TRUE,  TRUE,  FALSE)
dispneia    <- c(FALSE, TRUE,  FALSE, TRUE,  FALSE)

# Conjunção vetorizada — alerta por paciente
alerta_sirs     <- febre & taquicardia
alerta_resp     <- taquicardia | dispneia
alerta_combinado <- febre & (taquicardia | dispneia)

data.frame(febre, taquicardia, dispneia,
           SIRS = alerta_sirs,
           Resp = alerta_resp,
           Comb = alerta_combinado)
  febre taquicardia dispneia  SIRS  Resp  Comb
1  TRUE        TRUE    FALSE  TRUE  TRUE  TRUE
2  TRUE       FALSE     TRUE FALSE  TRUE  TRUE
3 FALSE        TRUE    FALSE FALSE  TRUE FALSE
4  TRUE        TRUE     TRUE  TRUE  TRUE  TRUE
5 FALSE       FALSE    FALSE FALSE FALSE FALSE

Tabelas-Verdade: Negação, Conjunção, Disjunção e Condicional

Negação \(\neg p\) e Conjunção \(p \wedge q\)

\(p\) \(\neg p\) \(p\) \(q\) \(p \wedge q\)
V F V V V
F V V F F
F V F
F F F

Exemplo (SIRS): \(p\) = febre, \(q\) = taquicardia, \(r\) = taquipneia \[\text{SIRS} \equiv (p \wedge q) \vee (p \wedge r) \vee (q \wedge r)\]

Disjunção \(p \vee q\) e Condicional \(p \rightarrow q\)

\(p\) \(q\) \(p \vee q\) \(p \rightarrow q\)
V V V V
V F V F
F V V V
F F F V

Importante

O condicional é falso somente quando a premissa é V e a conclusão é F — quando a regra “mente”.

Tabelas-Verdade dos Conectivos Lógicos

\(p\) \(q\) \(\neg p\) \(p \wedge q\) \(p \vee q\) \(p \oplus q\) \(p \rightarrow q\) \(p \leftrightarrow q\)
V V F V V F V V
V F F F V V F F
F V V F V V V F
F F V F F F V V

Formas Normais

  • Qualquer fórmula lógica pode ser convertida em formas padrão:
  • Forma Normal Conjuntiva (FNC): conjunção de cláusulas disjuntivas \[(p \vee q) \wedge (\neg p \vee r) \wedge (q \vee \neg r)\]
  • Forma Normal Disjuntiva (FND): disjunção de cláusulas conjuntivas \[(p \wedge q) \vee (\neg p \wedge r)\]
  • Úteis para algoritmos de inferência em sistemas especialistas
  • A FNC é a base do algoritmo de resolução (Robinson, 1965)

Na prática clínica: um protocolo de decisão ramificado pode ser convertido para FNC e verificado automaticamente por um sistema computacional.

Lógica de Predicados

  • Estende a lógica proposicional com variáveis, predicados e quantificadores
  • Um predicado expressa uma propriedade ou relação: \(\text{Febre}(x)\), \(\text{Alergia}(x, y)\)
  • Quantificador universal \(\forall\): “para todo”
    • \(\forall x \; [\text{Diabético}(x) \rightarrow \text{MonitorarGlicemia}(x)]\)
  • Quantificador existencial \(\exists\): “existe ao menos um”
    • \(\exists x \; [\text{Paciente}(x) \wedge \text{Internado}(x) \wedge \text{Febre}(x)]\)

Leitura clínica: “Todo paciente diabético deve ter a glicemia monitorada” e “Existe ao menos um paciente internado com febre.”

Inferência: Modus Ponens e Modus Tollens

Modus Ponens (afirmar afirmando)

\[\frac{p \rightarrow q \\ p}{\therefore \; q}\]

SE febre E tosse ENTÃO suspeitar de gripe.
O paciente tem febre e tosse.
\(\therefore\) Suspeitar de gripe. ✓

Modus Tollens (negar negando)

\[\frac{p \rightarrow q \\ \neg q}{\therefore \; \neg p}\]

SE pneumonia ENTÃO raio-X alterado.
O raio-X está normal.
\(\therefore\) Provavelmente não é pneumonia. ✓

Esses dois padrões de inferência são a base do raciocínio automático em sistemas especialistas clínicos.

Sistemas Especialistas: Arquitetura

Base de Conhecimento Regras SE...ENTÃO Memória de Trabalho Fatos do caso atual Motor de Inferência Forward / Backward Interface com o Usuário Médico / Enfermeiro nova consulta

Forward Chaining (Encadeamento para Frente)

  • Parte dos fatos conhecidos e avança em direção a conclusões
  • Estratégia: “dado o que sei, o que posso concluir?”
  • Orientado a dados: começa pelos dados disponíveis

Exemplo — triagem no pronto-socorro:

  1. Fato: temperatura = 39,2°C → ativa regra: “febre alta”
  2. Fato: SpO₂ (saturação periférica de oxigênio) = 91% → ativa regra: “hipoxemia”
  3. Fato: frequência respiratória = 28 rpm → ativa regra: “taquipneia”
  4. Combinação das três regras → conclui: “alerta de insuficiência respiratória aguda”
  5. Ação: acionar protocolo de emergência

Backward Chaining (Encadeamento para Trás)

  • Parte de uma hipótese e busca os fatos que a sustentam
  • Estratégia: “para confirmar X, quais evidências preciso?”
  • Orientado a metas: começa pela conclusão desejada

Exemplo — investigação de pneumonia:

  1. Meta: confirmar pneumonia
  2. Para pneumonia, preciso de: febre E tosse E (infiltrado no raio-X OU consolidação na TC)
  3. Verificar febre → presente ✓
  4. Verificar tosse → presente ✓
  5. Solicitar raio-X → infiltrado presente ✓
  6. Conclusão: hipótese de pneumonia confirmada → iniciar antibiótico

Fatores de Certeza (Certainty Factors)

  • A lógica clássica é binária, mas na clínica as evidências têm graus de confiança
  • Shortliffe & Buchanan (MYCIN, 1975) introduziram os fatores de certeza (CF)
  • CF \(\in [-1, 1]\): \(-1\) = certamente falso, \(0\) = neutro, \(+1\) = certamente verdadeiro
  • Combinação de evidências:
    • Se CF(\(p\)) = 0,7 e CF(\(q\)) = 0,6, então CF(\(p \wedge q\)) = min(0,7; 0,6) = 0,6
    • CF(\(p \vee q\)) = max(0,7; 0,6) = 0,7

MYCIN foi o primeiro sistema especialista médico de sucesso (diagnóstico de infecções bacterianas), usando exatamente esse mecanismo. Em testes cegos, igualou o desempenho de especialistas humanos em 65% dos casos.

Exemplo em R: Verificação de Regras Lógicas

Simular um motor de inferência simples para triagem de síndrome gripal baseado em regras SE…ENTÃO.

# Fatos do paciente (V/F)
febre     <- TRUE   # temperatura > 38°C
tosse     <- TRUE   # tosse seca
mialgia   <- FALSE  # dor muscular
dispneia  <- FALSE  # falta de ar

# Regras
gripal     <- febre & tosse & mialgia
alerta_uci <- febre & dispneia   # UTI: Unidade de Terapia Intensiva
isolamento <- febre & (tosse | dispneia)

# Resultados
cat("=== Triagem por Regras Lógicas ===\n")
=== Triagem por Regras Lógicas ===
cat(sprintf("Síndrome Gripal:    %s\n", ifelse(gripal, "POSITIVO", "negativo")))
Síndrome Gripal:    negativo
cat(sprintf("Alerta UTI:         %s\n", ifelse(alerta_uci, "POSITIVO", "negativo")))
Alerta UTI:         negativo
cat(sprintf("Indicar Isolamento: %s\n", ifelse(isolamento, "POSITIVO", "negativo")))
Indicar Isolamento: POSITIVO

Limitações da Lógica Clássica em Saúde

  • Tudo é V ou F — não há meio-termo
  • “Febre alta” é verdadeiro ou falso? Depende do limiar — 37,9°C não é febre, mas 38,0°C é?
  • Não modela gradações linguísticas: “dor leve”, “pressão levemente elevada”
  • Regras são rígidas: uma condição fora do limiar invalida toda a regra
  • Não lida bem com dados ruidosos ou imprecisos — comuns em ambientes clínicos

Importante

A linguagem médica é inerentemente vaga e gradual. A lógica clássica força uma precisão artificial que muitas vezes não existe nos dados reais.

Exercício 1 — Bloco A

Exercício: escreva a tabela-verdade completa da fórmula \(\neg p \vee (p \rightarrow q)\) e verifique com R se é uma tautologia (sempre verdadeira).

p <- c(TRUE, TRUE, FALSE, FALSE)
q <- c(TRUE, FALSE, TRUE, FALSE)

resultado <- !p | (p & q) | (!p)
# Equivalente a: ¬p ∨ (p → q) = ¬p ∨ (¬p ∨ q) = ¬p ∨ q
resultado_simples <- !p | (!p | q)

data.frame(
  p = p, q = q,
  `neg_p` = !p,
  `p→q` = !p | q,
  `neg_p ∨ (p→q)` = !p | (!p | q),
  check.names = FALSE
)
      p     q neg_p   p→q neg_p ∨ (p→q)
1  TRUE  TRUE FALSE  TRUE          TRUE
2  TRUE FALSE FALSE FALSE         FALSE
3 FALSE  TRUE  TRUE  TRUE          TRUE
4 FALSE FALSE  TRUE  TRUE          TRUE

A Tabela-Verdade do Casamento


Marcelo Juliana Conclusão
Errado Certa Juliana está certa
Certo Certa Juliana está certa
Certo Errada Juliana está certa
Errado Errada Marcelo está errado


“Qualquer semelhança com a realidade é mera coincidência.”

Bloco B — Lógicas Não Clássicas

Outras Lógicas

  • Lógica Modal: adiciona os operadores de possibilidade (\(\Diamond p\) — “é possível que \(p\)”) e necessidade (\(\Box p\) — “é necessariamente verdade que \(p\)”). Usada implicitamente quando listamos diagnósticos diferenciais (“é possível que seja pneumonia”) ou definimos protocolos obrigatórios (“necessariamente isolar”).

  • Lógica Temporal: adiciona operadores para raciocinar sobre sequência e duração de eventos (\(p \mathcal{U} q\) — “\(p\) até que \(q\)”). Base dos sistemas de alertas com janela de tempo em UTI (Unidade de Terapia Intensiva): “se SpO₂ (saturação periférica de oxigênio) < 90% por mais de 30 segundos, acionar alarme”.

Não vamos aprofundar essas lógicas aqui — o importante é saber que existem e têm aplicações em SAD clínicos. O foco deste bloco é a lógica não monotônica, muito mais diretamente útil para o raciocínio diagnóstico.

Lógica Não Monotônica

  • Na lógica clássica, uma vez provado algo, é sempre verdadeiro (monotônico)
  • Na prática médica, conclusões mudam quando novas informações chegam
  • Lógica não monotônica: permite revogar conclusões anteriores

Exemplo clínico:

  1. Paciente com tosse + febre → suspeita de gripe ✓
  2. Novo dado: contato com caso de tuberculose confirmado → revisão da suspeita
  3. Novo dado: raio-X com cavitação → conclusão anterior revogada → suspeita de TB

Sistemas de apoio à decisão precisam ter essa capacidade de atualização de hipóteses à medida que novos exames chegam.

Comparação das Lógicas

Característica Clássica Não Monotônica Fuzzy
Valores de verdade {V, F} {V, F} [0, 1]
Revisão de crenças
Gradações linguísticas
Fronteiras de conjuntos Rígidas Rígidas Graduais
Robustez a ruído clínico Baixa Média Alta
Uso típico em SAD Regras e alertas Atualização diagnóstica Triagem e dosagem

Bloco C — Lógica Fuzzy

A Motivação: Imprecisão na Linguagem Médica

  • “O paciente está com febre alta” — o que é alto? Acima de 38? De 39? De 40?
  • Pressão elevada” — 135 mmHg é elevada? E 139? E 141?
  • Dor moderada” — como quantificar rigorosamente?
  • Idoso” — 60 anos é idoso? 65? 70?
  • Forçar limiares rígidos cria saltos abruptos clinicamente injustificáveis

O problema do limiar: Um paciente com PAS = 139 mmHg está “normal”. Com 140 mmHg está “hipertenso”. A diferença de 1 mmHg muda o diagnóstico — mas muda de fato o risco clínico?

Conjuntos Crisp vs. Conjuntos Fuzzy

Conjunto Crisp (clássico)

Pertinência \(\in \{0, 1\}\) — binária

“Febre” se temperatura > 38°C:

Temp (°C) Pertence?
37,9 0 (não)
38,0 1 (sim)
39,5 1 (sim)
41,0 1 (sim)

Salto abrupto em 38°C — irreal.

Conjunto Fuzzy

Pertinência \(\mu \in [0, 1]\) — gradual

“Febre Alta” com função trapezoidal:

Temp (°C) \(\mu_{\text{febre alta}}\)
37,5 0,00
38,5 0,33
39,5 0,83
40,5 1,00
41,0 1,00

Transição suave — realista. ✓

Definição Formal de Conjunto Fuzzy

  • Um conjunto fuzzy \(A\) num universo \(U\) é uma função: \[A: U \rightarrow [0, 1]\]
  • \(A(x) = \mu_A(x)\) é o grau de pertinência de \(x\) em \(A\)
  • \(\mu_A(x) = 0\): \(x\) definitivamente não pertence a \(A\)
  • \(\mu_A(x) = 1\): \(x\) definitivamente pertence a \(A\)
  • \(0 < \mu_A(x) < 1\): \(x\) pertence parcialmente a \(A\)
  • Conjuntos crisp são casos especiais: \(\mu_A(x) \in \{0, 1\}\)

Zadeh (1965): “A fuzzy set is a class of objects with a continuum of grades of membership.”

Funções de Pertinência

Triangular — pico em \(b\), zero em \(a\) e \(c\)

Clique para ver o código
library(ggplot2)
tri_mf <- function(x,a,b,c) pmax(0,pmin((x-a)/(b-a),(c-x)/(c-b)))
x <- seq(35,42,by=0.05)
df <- rbind(
  data.frame(x=x,mu=tri_mf(x,36.0,36.8,37.5),cat="Normal"),
  data.frame(x=x,mu=tri_mf(x,37.0,38.0,39.0),cat="Subfebril"),
  data.frame(x=x,mu=tri_mf(x,38.0,39.0,40.5),cat="Febre Mod."),
  data.frame(x=x,mu=tri_mf(x,39.5,41.0,42.0),cat="Febre Alta"))
ggplot(df,aes(x=x,y=mu,color=cat))+geom_line(linewidth=1.1)+
  scale_color_manual(values=c("#7ecff7","#a8f77e","#f7c87e","#f07050"))+
  labs(x="Temperatura (°C)",y="μ(x)",color="")+
  theme_minimal(base_size=11)+theme(legend.position="bottom")

Trapezoidal — platô entre \(b\) e \(c\); Sigmoide — monotônica

Clique para ver o código
library(ggplot2)
x <- seq(100,180,by=0.5)
df <- rbind(
  data.frame(x=x,mu=pmax(0,pmin((x-120)/10,1,(175-x)/5)),
             tipo="Trapezoidal — Normal/Limítrofe"),
  data.frame(x=x,mu=1/(1+exp(-0.15*(x-140))),
             tipo="Sigmoide — Hipertensão"))
ggplot(df,aes(x=x,y=mu,color=tipo))+geom_line(linewidth=1.1)+
  scale_color_manual(values=c("#7ecff7","#f07050"))+
  geom_vline(xintercept=140,color="#aaa",linetype="dashed")+
  annotate("text",x=140,y=0.6,label="140 mmHg",
           color="#aaa",hjust=-0.1,size=3)+
  labs(x="PAS (mmHg)",y="μ(x)",color="")+
  theme_minimal(base_size=11)+theme(legend.position="bottom")

\(\alpha\)-Cortes: Conectando Fuzzy e Crisp

  • Um \(\alpha\)-corte de um conjunto fuzzy \(A\) é o conjunto crisp de todos os elementos com pertinência \(\geq \alpha\):

\[A_\alpha = \{x \in U : \mu_A(x) \geq \alpha\}\]

  • Para \(\alpha = 1\): obtemos o núcleo — os elementos que pertencem completamente
  • Para \(\alpha \to 0\): obtemos o suporte — todos os elementos com pertinência positiva
  • α-cortes permitem converter conclusões fuzzy em decisões binárias quando necessário

Exemplo clínico: SE o grau de suspeita de pneumonia \(> 0{,}7\) (α = 0,7), ENTÃO iniciar antibiótico — usando um α-corte para tomar uma decisão clínica binária a partir de um raciocínio fuzzy.

Operações em Conjuntos Fuzzy

Dadas duas funções de pertinência \(A\) e \(B\) sobre o mesmo universo \(U\):

Operação Fórmula Analogia crisp
Complemento \(\mu_{\bar{A}}(x) = 1 - \mu_A(x)\) \(\neg p\)
Interseção (E) \(\mu_{A \cap B}(x) = \min(\mu_A(x), \mu_B(x))\) \(p \wedge q\)
União (OU) \(\mu_{A \cup B}(x) = \max(\mu_A(x), \mu_B(x))\) \(p \vee q\)

Exemplo: paciente com \(\mu_{\text{febre alta}}(x) = 0{,}7\) e \(\mu_{\text{taquicardia}}(x) = 0{,}5\)

  • E (ambas condições): \(\min(0{,}7;\; 0{,}5) = 0{,}5\)
  • OU (ao menos uma): \(\max(0{,}7;\; 0{,}5) = 0{,}7\)
  • SEM febre alta: \(1 - 0{,}7 = 0{,}3\)

T-normas e T-conormas

  • O mínimo e o máximo são as operações padrão, mas não as únicas
  • T-norma (AND generalizado): qualquer função \(T: [0,1]^2 \to [0,1]\) satisfazendo condições de comutatividade, associatividade, monotonicidade e \(T(x,1)=x\)
  • T-conorma (OR generalizado): dual da t-norma
Nome T-norma (AND) T-conorma (OR)
Zadeh (Mín/Máx) \(\min(a, b)\) \(\max(a, b)\)
Produto \(a \cdot b\) \(a + b - a \cdot b\)
Łukasiewicz \(\max(0, a+b-1)\) \(\min(1, a+b)\)

Na prática clínica, o produto é frequentemente preferido por ser mais conservador — exige que ambas as condições sejam fortes para que a conjunção seja forte.

Visualizando Operações Fuzzy

Clique para ver o código
library(ggplot2)

# Para visualização, usamos um paciente na zona de transição
# temp=38.2°C: rampa de febre (37.5→38.5), mf = (38.2-37.5)/1 = 0.70
# PAS=136mmHg: rampa de hipertensão (130→140),  mh = (136-130)/10 = 0.60
t_val <- 38.2; p_val <- 136
mf <- pmax(0, pmin((t_val - 37.5) / 1, 1))
mh <- pmax(0, pmin((p_val - 130) / 10, 1))

df_ops <- data.frame(
  Operacao = c("μ(Febre Alta)", "μ(Hipertensão)",
               "E (min)", "OU (max)", "Sem Febre (1-μ)"),
  Valor = c(mf, mh, min(mf, mh), max(mf, mh), 1 - mf)
)

ggplot(df_ops, aes(x = Operacao, y = Valor, fill = Operacao)) +
  geom_col(width = 0.6) +
  scale_fill_manual(values = c("#f07050","#7ecff7","#f7c87e","#a8f77e","#c87ef7")) +
  scale_y_continuous(limits = c(0, 1)) +
  geom_text(aes(label = round(Valor, 2)), vjust = -0.4, size = 4.5) +
  labs(title = sprintf("Operações Fuzzy — Paciente: temp=%.1f°C, PAS=%.0f mmHg",
                       t_val, p_val),
       x = "", y = "Grau de pertinência") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

Regras Fuzzy: Estrutura

  • Regras da forma: SE <antecedente fuzzy> ENTÃO <consequente fuzzy>
  • Antecedentes e consequentes são proposições fuzzy — não V/F, mas com grau
  • Exemplo de base de regras para triagem de dor:
Regra SE (dor) E (duração) ENTÃO (prioridade)
R1 leve curta baixa
R2 leve longa moderada
R3 moderada qualquer moderada
R4 intensa qualquer alta
R5 insuportável qualquer emergência

Sistema de Inferência Fuzzy: Visão Geral

Entradas Valores nítidos (temp, PAS, dor...) Fuzzificação Converter entrada em graus μ Inferência Aplicar regras fuzzy Defuzzificação Converter saída fuzzy em número

As quatro etapas:

  1. Fuzzificação: converter entradas nítidas em graus de pertinência
  2. Avaliação das regras: calcular o grau de ativação de cada regra
  3. Agregação: combinar os consequentes de todas as regras ativas
  4. Defuzzificação: converter a saída fuzzy em um valor nítido

Etapa 1: Fuzzificação

  • Converter o valor nítido de entrada em graus de pertinência para cada conjunto fuzzy
  • Exemplo: temperatura = 39,2°C
temp_val <- 39.2

# Funções de pertinência para temperatura
mu_normal   <- pmax(0, pmin((temp_val - 36.0)/0.8, (37.4 - temp_val)/0.6))
mu_subfebril <- pmax(0, pmin((temp_val - 37.0)/0.5, (38.5 - temp_val)/0.5))
mu_febre_mod <- pmax(0, pmin((temp_val - 38.0)/0.7, (40.0 - temp_val)/0.8))
mu_febre_alt <- pmax(0, pmin((temp_val - 39.0)/0.5, 1))

cat(sprintf("Temperatura: %.1f°C\n\n", temp_val))
Temperatura: 39.2°C
cat(sprintf("μ(Normal):       %.3f\n", mu_normal))
μ(Normal):       0.000
cat(sprintf("μ(Subfebril):    %.3f\n", mu_subfebril))
μ(Subfebril):    0.000
cat(sprintf("μ(Febre Mod.):   %.3f\n", mu_febre_mod))
μ(Febre Mod.):   1.000
cat(sprintf("μ(Febre Alta):   %.3f\n", mu_febre_alt))
μ(Febre Alta):   0.400

Etapa 2: Sistema de Inferência Mamdani

  • Método mais intuitivo e amplamente usado em aplicações clínicas (Mamdani & Assilian, 1975)
  • Para cada regra: o grau de ativação é determinado pela t-norma (mín) dos antecedentes
  • O consequente é truncado na altura do grau de ativação

Exemplo com duas regras:

  • R1: SE febre_moderada (\(\mu = 0{,}25\)) E taquicardia (\(\mu = 0{,}6\)) ENTÃO urgência = moderada
    • Ativação: \(\min(0{,}25;\; 0{,}6) = 0{,}25\) → truncar “moderada” em 0,25
  • R2: SE febre_alta (\(\mu = 0{,}40\)) ENTÃO urgência = alta
    • Ativação: \(0{,}40\) → truncar “alta” em 0,40

Etapa 3: Agregação

  • Combinar os consequentes (já truncados) de todas as regras ativas
  • Operação padrão: máximo ponto a ponto das funções de saída truncadas
  • Resulta numa função fuzzy de saída que representa a conclusão combinada do sistema
Clique para ver o código
library(ggplot2)

urgencia <- seq(0, 10, by = 0.05)

# Funções de pertinência da saída: baixa, moderada, alta
mu_baixa <- pmax(0, pmin((urgencia)/3, (4 - urgencia)/1))
mu_mod   <- pmax(0, pmin((urgencia - 3)/2, (8 - urgencia)/2))
mu_alta  <- pmax(0, pmin((urgencia - 6)/1.5, 1))

# Graus de ativação das regras do exemplo anterior
a_R1 <- 0.25; a_R2 <- 0.40

# Consequentes truncados
tronc_mod  <- pmin(mu_mod,  a_R1)
tronc_alta <- pmin(mu_alta, a_R2)

# Agregação: máximo
agregado <- pmax(tronc_mod, tronc_alta)

df <- data.frame(
  x = rep(urgencia, 4),
  mu = c(tronc_mod, tronc_alta, agregado, pmax(mu_mod, mu_alta)),
  tipo = rep(c("R1 truncada (mod, α=0.25)",
               "R2 truncada (alta, α=0.40)",
               "Agregado (máximo)",
               "Original (sem truncamento)"), each = length(urgencia))
)

ggplot(df, aes(x = x, y = mu, color = tipo, linetype = tipo)) +
  geom_line(linewidth = 1.1) +
  scale_color_manual(values = c("#7ecff7","#f07050","#a8f77e","#ccc")) +
  scale_linetype_manual(values = c("solid","solid","solid","dashed")) +
  labs(title = "Agregação Mamdani — Função de Saída Combinada",
       x = "Urgência (0–10)", y = "Grau de pertinência", color = "", linetype = "") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")

Etapa 4: Defuzzificação

  • Converter a função fuzzy de saída em um único valor nítido
  • Centroide (Centro de Gravidade) — método mais comum:

\[x^* = \frac{\int x \cdot \mu_{\text{agg}}(x) \, dx}{\int \mu_{\text{agg}}(x) \, dx} \approx \frac{\sum_i x_i \cdot \mu_{\text{agg}}(x_i)}{\sum_i \mu_{\text{agg}}(x_i)}\]

urgencia <- seq(0, 10, by = 0.05)
mu_mod   <- pmax(0, pmin((urgencia - 3)/2, (8 - urgencia)/2))
mu_alta  <- pmax(0, pmin((urgencia - 6)/1.5, 1))
tronc_mod  <- pmin(mu_mod,  0.25)
tronc_alta <- pmin(mu_alta, 0.40)
agregado   <- pmax(tronc_mod, tronc_alta)

# Centroide
centroide <- sum(urgencia * agregado) / sum(agregado)
cat(sprintf("Valor defuzzificado (centroide): %.2f / 10\n", centroide))
Valor defuzzificado (centroide): 7.02 / 10
cat(sprintf("Interpretação: urgência %.0f%%\n", centroide * 10))
Interpretação: urgência 70%

Funções de Pertinência na Prática Clínica

Clique para ver o código
library(ggplot2)

# Escala de dor (0-10) com 4 categorias linguísticas
dor <- seq(0, 10, by = 0.05)

mu_leve    <- pmax(0, pmin(1, (3 - dor)/2))
mu_mod     <- pmax(0, pmin((dor - 1)/2, (6 - dor)/2))
mu_intensa <- pmax(0, pmin((dor - 4)/2, (9 - dor)/2))
mu_insup   <- pmax(0, pmin((dor - 7)/2, 1))

df <- data.frame(
  x   = rep(dor, 4),
  mu  = c(mu_leve, mu_mod, mu_intensa, mu_insup),
  cat = rep(c("Leve", "Moderada", "Intensa", "Insuportável"), each = length(dor))
)
df$cat <- factor(df$cat, levels = c("Leve","Moderada","Intensa","Insuportável"))

ggplot(df, aes(x = x, y = mu, color = cat)) +
  geom_line(linewidth = 1.2) +
  scale_color_manual(values = c("#a8f77e","#7ecff7","#f7c87e","#f07050")) +
  labs(title = "Funções de Pertinência — Escala de Dor (0–10)",
       x = "Intensidade da dor (EVA — Escala Visual Analógica)", y = "Grau de pertinência μ(x)",
       color = "Categoria") +
  theme_minimal(base_size = 13)

Aplicação: Triagem de Urgência Clínica

  • Um sistema de triagem fuzzy avalia múltiplas variáveis linguísticas simultaneamente
  • Variáveis de entrada: temperatura, frequência cardíaca, SpO₂, escala de dor
  • Base de regras: definida por especialistas em triagem (protocolo Manchester fuzzy)
  • Saída: escore de urgência contínuo → classificação em cores (verde/amarelo/laranja/vermelho)

Vantagem sobre Manchester clássico: o sistema fuzzy elimina a descontinuidade dos limiares. Um paciente com SpO₂ de 94% (limiar clássico: amarelo) não recebe a mesma classificação que um com 91% — o sistema fuzzy os diferencia adequadamente.

Exercícios — Bloco C

Ex. 1 — Fuzzificação: SpO₂ = 93%

spo2 <- 93
mu_normal    <- pmax(0, pmin((spo2 - 94)/2, 1))
mu_hip_leve  <- pmax(0, pmin((spo2 - 89)/2, (96 - spo2)/2))
mu_hip_grave <- pmax(0, pmin((92 - spo2)/2, 1))
cat(sprintf("μ(Normal):    %.3f\n", mu_normal))
μ(Normal):    0.000
cat(sprintf("μ(Hip. Leve): %.3f\n", mu_hip_leve))
μ(Hip. Leve): 1.500
cat(sprintf("μ(Hip. Grave):%.3f\n", mu_hip_grave))
μ(Hip. Grave):0.000

Exercícios — Bloco C

Paciente predominantemente em hipoxemia leve, com componente crescente de grave.

Ex. 2 — Sistema Mamdani: temp = 39°C, SpO₂ = 93%

t <- 39.0; s <- 93.0
mu_tf <- pmax(0, pmin((t-37.5)/1, (40.5-t)/1))
mu_ta <- pmax(0, pmin((t-39.0)/0.8, 1))
mu_sl <- pmax(0, pmin((s-89)/2, (96-s)/2))
mu_sg <- pmax(0, pmin((92-s)/2, 1))

R <- c(min(mu_tf,mu_sl), min(mu_ta,mu_sl), min(mu_tf,mu_sg))
centros <- c(4.0, 7.0, 9.5)
escore  <- sum(centros*R)/sum(R)

cat(sprintf("Escore: %.2f/10 → %s\n", escore,
  ifelse(escore<5,"Amarelo",ifelse(escore<7,"Laranja","Vermelho"))))
Escore: 4.00/10 → Amarelo

Lógica Fuzzy em Aplicações Reais de Saúde

  • Dosagem de medicamentos: sistemas fuzzy para calcular doses de insulina, heparina ou sedação em UTI com base em múltiplos parâmetros fisiológicos
  • Classificação de imagens médicas: sistemas de auxílio ao diagnóstico por imagem com saída de grau de suspeição (não “positivo/negativo”)
  • Monitoramento contínuo: detecção precoce de deterioração clínica combinando múltiplos sinais com graus de alarme graduais
  • Protocolos de triagem: versões fuzzy dos protocolos de Manchester e ESI, reduzindo paradoxos de limiar

Referência: KLIR & YUAN (1995, caps. 12–13) e NGUYEN & WALKER (2019, cap. 13) trazem exemplos detalhados de sistemas fuzzy em controle e tomada de decisão clínica.

Exercício 4 — Integrador: Lógica Clássica vs. Fuzzy

Exercício: um hospital usa dois sistemas para classificar risco de readmissão de pacientes com insuficiência cardíaca:

  • Sistema A (clássico): risco alto SE idade > 70 E FE (Fração de Ejeção) < 35% E internações > 2 no último ano
  • Sistema B (fuzzy): usa pertinências graduais para “idoso”, “FE muito reduzida” e “múltiplas internações”

Paciente: 68 anos, FE (Fração de Ejeção) = 36%, 2 internações no último ano.

Classifique pelo Sistema A e calcule os graus de ativação no Sistema B.

# Dados do paciente
idade   <- 68; fe <- 36; intern <- 2

# Sistema A (lógica clássica — binário)
risco_a <- (idade > 70) & (fe < 35) & (intern > 2)
cat(sprintf("Sistema A (clássico): %s\n\n",
            ifelse(risco_a, "RISCO ALTO", "risco baixo")))
Sistema A (clássico): risco baixo
# Sistema B (lógica fuzzy)
mu_idoso <- pmax(0, pmin((idade - 60)/15, 1))
mu_fe    <- pmax(0, pmin((40 - fe)/10, 1))
mu_int   <- pmax(0, pmin((intern - 1)/3, 1))

cat("Sistema B (fuzzy):\n")
Sistema B (fuzzy):
cat(sprintf("  μ(idoso):              %.3f\n", mu_idoso))
  μ(idoso):              0.533
cat(sprintf("  μ(FE muito reduzida):  %.3f\n", mu_fe))
  μ(FE muito reduzida):  0.400
cat(sprintf("  μ(múltiplas intern.):  %.3f\n", mu_int))
  μ(múltiplas intern.):  0.333
cat(sprintf("  Grau de risco (min):   %.3f\n", min(mu_idoso, mu_fe, mu_int)))
  Grau de risco (min):   0.333
cat(sprintf("  Grau de risco (prod.): %.3f\n", mu_idoso * mu_fe * mu_int))
  Grau de risco (prod.): 0.071
cat("\nConclusão: Sistema A não detecta risco; Sistema B indica risco moderado.\n")

Conclusão: Sistema A não detecta risco; Sistema B indica risco moderado.

Lista de Verificação: O que Você Deve Saber Após Esta Aula

  1. ✅ Construir tabelas-verdade para fórmulas proposicionais simples
  2. ✅ Identificar modus ponens e modus tollens em argumentos clínicos
  3. ✅ Explicar a diferença entre forward e backward chaining
  4. ✅ Descrever as limitações da lógica clássica para raciocínio clínico
  5. ✅ Definir conjunto fuzzy e função de pertinência
  6. ✅ Realizar as operações de complemento, interseção e união fuzzy
  7. ✅ Descrever as quatro etapas de um sistema de inferência Mamdani
  8. ✅ Calcular a defuzzificação pelo centroide ou média ponderada

Leitura Complementar para a Próxima Aula

  • NGUYEN & WALKER (2019): Caps. 1–2 (conjuntos fuzzy e operações) e Cap. 13 (controle e modelagem fuzzy)
  • KLIR & YUAN (1995): Cap. 1 (introdução) e Cap. 12 (aplicações em engenharia)
  • Para a Aula 3: revisar probabilidade condicional e Teorema de Bayes (já visto na Aula 1); os slides de revisão ainda estarão disponíveis

Na Aula 3 trabalharemos com os livros SCUTARI & DENIS (Bayesian Networks with Examples in R) e KOLLER & FRIEDMAN (Probabilistic Graphical Models), já disponíveis como referências da disciplina.

Referências

Lógica Clássica e Sistemas Especialistas

  • GENESERETH, M.; NILSSON, N. Logical Foundations of Artificial Intelligence. Morgan Kaufmann, 1987.
  • SHORTLIFFE, E. H.; BUCHANAN, B. G. A model of inexact reasoning in medicine. Mathematical Biosciences, v. 23, p. 351–379, 1975. (Artigo original do MYCIN)

Lógica Fuzzy

  • ZADEH, L. A. Fuzzy sets. Information and Control, v. 8, n. 3, p. 338–353, 1965. (Artigo original)
  • KLIR, G. J.; YUAN, B. Fuzzy Sets and Fuzzy Logic: Theory and Applications. Prentice Hall, 1995.
  • NGUYEN, H. T.; WALKER, E. A. A First Course in Fuzzy Logic. 4. ed. CRC Press, 2019.
  • LOOTSMA, F. A. Fuzzy Logic for Planning and Decision Making. Springer, 1997.
  • MAMDANI, E. H.; ASSILIAN, S. An experiment in linguistic synthesis with a fuzzy logic controller. International Journal of Man-Machine Studies, v. 7, p. 1–13, 1975.

Obrigado!

Métodos de Tomada de Decisão · PPGMDS · UFPB

Aula 2 — A Lógica e seus Tipos

Prof. Marcelo R.P. Ferreira · DE-UFPB


Próxima aula: 21/07/2026 — Tratamento da Incerteza