Matemática Discreta - Aula 04
Exercício em C
Criar uma função que receba a operação, e duas proposições, verdadeiras ou não. A partir da operação escolhida execute o conectivo lógico conforme a tabela abaixo:
Código operação | Retorno |
---|---|
1 | $p \land q$ |
2 | $p \lor q$ |
3 | $p \underline\lor q$ |
4 | $p \to q$ |
5 | $p \rlap{, \gets}\to q$ |
Qualquer outro valor | “Não temos esta operação” |
Código Base
c code snippet start
#include <stdio.h>
#include <stdbool.h>
/**
* Verifica, de acordo com o conectivo lógico escolhido, a solução lógica entre duas proposições
* @method logicalProp();
* @param {inteiro} option = recebe o valor do menu selecionado pelo usuário.
* @param {booleano} p / q = proposições lógicas
* @return {booleano} = Retorna o valor lógico de acordo com o conectivo escolhido.
*/
bool logicalProp(int option, bool p, bool q)
{
if(option == 1){
//deverá retornar p E q
} else if(option == 2){
//deverá retornar p OU q
} else if(option == 3){
//deverá retornar OU p OU q
} else if(option == 4){
//deverá retornar p IMPLICA q
} else if(option == 5){
//deverá retornar p SE, E SOMENTE SE q
} else{
//deverá retornar "Não possuímos esta opção"
}
}
int main(void){
int menu;
printf("Selecione um conectivo lógico do menu abaixo: \n");
printf("1. E\n");
printf("2. OU\n");
printf("3. OU... OU...");
printf("4. SE... ENTÃO...");
printf("5. ... SE E SOMENTE SE ...");
scanf("%d", &menu);
// Chama a função com o número do menu digitado/escolhido pelo usuário, junto de duas proposições falsas por padrão.
logicalProp(menu, false, false);
// as proposições podem conter quaisquer valores lógicos. Você poderia, inclusive, jogar na tela duas proposições como "A grama é vermelha" ou "A terra é marrom" e resolver o valor delas através de uma variável.
return 0;
}
c code snippet end
c code snippet start
// Copyright Gabriel Coelho Soares 2023
#include <stdio.h>
#include <stdbool.h>
bool logicalProp(int option, bool p, bool q)
{
switch (option){
case 1:
return p && q; //V && F = F
break;
case 2:
return p || q; //V || F = V
break;
case 3:
//return !(p && q); //~F = V
//Correção terça-feira, 16:36:42 05-09-2023
return (!((!p || q)&&(!q || p))); //Verificar anotações da Aula 4
break;
case 4:
return !p || q; //~V || F = F
break;
case 5:
//return !(!(p && q)); //~(~(V)) = V
//Correção terça-feira, 16:37:43 05-09-2023
return ((!p || q)&&(!q || p)); //Verificar anotações da Aula 4
break;
default:
return "Não possuímos esta opção";
break;
}
}
int main(void){
//declaração de variáveis
int menu = 0;
bool prop = true, repeat = true;
printf("|************************|\n|*********MMD001*********|\n|************************|\n|**LÓGICA PROPOSICIONAL**|\n\n");
while(repeat){
//P = VERDADEIRO; Q = FALSO
printf("Analise as seguintes proposições:\n\nP = \"Todo número inteiro MULTIPLICADO por dois(2) resultará num número PAR\"\nQ = \"Todo número inteiro DIVIDIDO por dois(2) resultará num número PAR\"\n\n");
printf("Selecione um conectivo lógico do menu abaixo para verificar as proposições acima: \n1. E\n2. OU\n3. OU... OU...\n4. SE... ENTÃO...\n5. ... SE E SOMENTE SE ...\n\nDigite a opção desejada: ");
scanf("%d", &menu);
if(menu != 1 && menu != 2 && menu != 3 && menu != 4 && menu != 5){
printf("O Menu não possui esta opção!\nPor favor, escolha novamente.");
}else{
printf("O Resultado do conectivo selecionado foi: %s", logicalProp(menu, prop, (!prop)) ? "VERDADEIRO" : "FALSO");
printf("\n\nDeseja fazer novamente?\n1. Sim\n0. Não, encerrar\n\nDigite o que deseja: ");
scanf("%d", &menu);
if(menu == 0){repeat = false;}
}
}
}
c code snippet end
Conteúdo da primeira parte da aula
Equivalência em proposições
Utilizamos a seguinte representação
$\equiv$
Isso significa que os Valores lógicos finais de duas proposições são idênticos, ainda que $p$ esteja falando que coxinhas são deliciosas e $q$ fale que 2+2=4. São duas proposições cujo valor lógico resultam em verdadeiros, ainda que são duas proposições sem relação uma com a outra.
Propriedade Comutativa
$A \land B \equiv B \land A$ o mesmo vale para o OU $A \lor B \equiv B \lor A$
Propriedade Associativa
Se temos $(A \land B) \land C$ ou $(A \lor B) \lor C$ podemos fazer os dois primeiros, para verificar a resposta lógica. Assim, quaisquer duas proposições que pegamos, podemos checar entre elas para então checar com a terceira, não precisando utilizar do modo como lemos (esquerda para direita).
Propriedade Distributiva
$A \land (B \lor C) \equiv (A \land B) \lor (A \land C)$ $A \lor (B \land C) \equiv (A \lor B) \land (A \lor C)$ É como se fosse uma multiplicação do elemento “alheio” dentro dos elementos comutativos. Assim, utilizamos o conectivo lógico alheio (no exemplo, de A) para “multiplicar”, e o conectivo lógico comutativo (no exemplo entre o B e o C) para “somar” os resultados Apenas um exemplo $$ 2 × (1 + 2) \equiv (2×1) + (2×2) \implies A \land (B \lor C) \equiv (A\land B) \lor (A\land C) $$
Leis de Morgan
$(A\land B) \equiv ($$A) \lor ($$B)$
$B)$$(A\lor B) \equiv ($$A) \land ($
A negação de uma conexão de proposições, é negar cada uma das proposições e trocar o conectivo.
Exercício
Prove a equivalência $(p\lor q) \equiv ($$p) \land ($~$q)$
p | q | $p\lor q$ | ~$(p \lor q)$ | ~$p$ | ~$q$ | ( |
---|---|---|---|---|---|---|
V | V | V | F | F | F | F |
V | F | V | F | F | V | F |
F | V | V | F | V | F | F |
F | F | F | V | V | V | V |
Ou seja, ambas as proposições retornam o mesmo valor, logo: são equivalentes.
Os símbolos lógicos na programação
Na programação é difícil de inserir os conectivos lógicos da maneira que conhecemos, por isso os programadores facilitaram
Conectivo na Matemática | Significado | Conectivo na Programação |
---|---|---|
$p\land q$ | e | x && y |
$p\lor q$ | ou | x || y |
~$p$ | não | !x |
Exercício 2
Negar a seguinte sentença:
O ser humano é uma ave e o dobro de cinco é dez.
Solução
$p$ = “O ser humano é uma ave” $q$ = “o dobro de cinco é dez”
original $\implies p \land q$
a negação seria $\implies$ $(p \land q) \equiv$ $($$p) \lor ($~$q)$
Assim, a frase correta seria: O ser humano NÃO é uma ave OU o dobro de cinco NÃO é dez.
Algumas (outras) equivalências
$($$A) \equiv A$- $A \to B \equiv ($
$B) \to ($$A)$ - $A \to B \equiv$ ~$A \lor B$
$(A \to B) \equiv A \land ($$B)$- ~$(A \underline\lor B) \equiv A \rlap{, \gets}\to B$
- $A \rlap{, \gets}\to B \equiv (A \to B) \land (B \to A)$
Matemática Discreta - Aula 03 Matemática Discreta - Aula 05 Aprendendo algoritmos em C