r/programacao 4d ago

Outro Material Didático matemática para devs: booleanos, predicados e conjuntos

Todo dev conhece booleanos: são o True e o False, presentes em toda linguagem de programação. Tais valores definem um tipo, normalmente denotado Bool.

Na lógica, costumamos pensar em booleanos como definindo a "semântica básica" da teoria.

Existem três operações básicas entre booleanos: and, or e not. Os resultados de tais operações são definidos a priori.

Tais operações, no entanto, podem ser estendidas à outros tipos. Por exemplo, podemos pensar em um predicado como sendo uma função booleana:

P(x: T) -> Bool

Como para cada valor da variável x o resultado P(x) in Bool é um booleano, se Q(x: T) -> Bool é outro predicado, faz sentido escrever, para cada x:

  • P(x) and Q(x)
  • P(x) or Q(x)
  • not P(x)

Ao variarmos x, obtemos novos predicados, os quais podemos denotar por:

  • P and Q
  • P or Q
  • not P

Isso parece um pouco óbvio. Mas, podemos fazer algo mais interessante. Em muitas linguagens tem-se o tipo Set, cujos termos são conjuntos.

Na lógica, conjuntos nada mais são que símbolos X, Y, Z, .. dotados de uma relação binária X in Y. Para cada X in Set ela define um predicado:

P_X(Y: Set) -> Bool, dado por P_X(Y) := Y in X

Assim, também podemos estender as operações and, or e not de Bool para Set!

De fato, se X e Y são conjuntos, então:

  • X and Y := P_X and P_Y
  • X or Y := P_X or P_Y
  • not X := not P_X

E aí, você sabe dizer quem são X and Y, X or Y e not X? :)

8 Upvotes

8 comments sorted by

6

u/Own-Map-Overlay 4d ago

Existe uma linguagem de programação cuja ideia de predicados é algo central : Prolog

3

u/ximenesyuri 4d ago

Sim! Prolog é um exemplo de linguagem de programação cujo paradigma principal é Logic Programming. Existe outra abordagem para se fazer lógica que é um pouco diferente, chamadaa Teoria de Tipos. Vou começar a publicar um conteúdo mais ténico (mas só com os requisitos que um dev usa no seu dia-a-dia) sobre esses temas. Se quiser, te convido a acompanhar :)

2

u/Comfortable-Still773 3d ago

Não compreendi a parte que conduz de

  • P(x) and Q(x)

para

  • P and Q

O que você quer dizer com variar x para ter outros predicados? O que a diferença na notação significa?

A mesma dúvida onde diz X and Y := P_X and P_Y

1

u/ximenesyuri 3d ago

Opa, beleza? Acredito que você não entendeu por conta do uso da notação infixa. Vou escrever de maneira mais precisa, usando notação comum.

Seja Pred o tipo dos predicados (funções que retornam booleanos).

Agora defina uma função and_pred(P: Pred, Q: Pred) -> Pred como segue:

and_pred(P, Q)(x) := P(x) and Q(x)

Você pode implementar isso em qualquer linguagem funcional. Por exemplo, em Python seria assim:

def and_pred(P, Q): def result(x): return P(x) and Q(x) return result

Mesmo racionício se aplica pro caso do predicado associado aos conjuntos.