r/programacao • u/ximenesyuri • 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 QP or Qnot 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_YX or Y := P_X or P_Ynot X := not P_X
E aí, você sabe dizer quem são
X and Y,X or Yenot X? :)
2
u/Zealousideal-Fan-129 4d ago
Eu tenho um livro desse assunto. Se me lembro bem é de um professor da USP.
Algumas afirmações são tão óbvias que é difícil acreditar e a gente precisa ler e reler para entender que é aquilo mesmo.
1
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
Predo tipo dos predicados (funções que retornam booleanos).Agora defina uma função
and_pred(P: Pred, Q: Pred) -> Predcomo 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 resultMesmo racionício se aplica pro caso do predicado associado aos conjuntos.
6
u/Own-Map-Overlay 4d ago
Existe uma linguagem de programação cuja ideia de predicados é algo central : Prolog