Skip to main content dev:Coelho

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çãoRetorno
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)$ $(A\lor B) \equiv ($$A) \land ($$B)$

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)$

pq$p\lor q$~$(p \lor q)$~$p$~$q$($A) \land ($$B)$
VVVFFFF
VFVFFVF
FVVFVFF
FFFVVVV

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áticaSignificadoConectivo na Programação
$p\land q$ex && y
$p\lor q$oux || 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