Lógica


  A lógica diz respeito à coerencia de raciocínio e de ideias.
  O conhecimento de lógica é importante na solução de problemas que envolvam decisões e caminhos a tomar em programas.

  1. Operações lógicas

  As operações lógicas podem ser feitas a partir de um até infinito operandos, sempre resultando em apenas uma saída. Normalmente, utilizamos um ou dois operandos.
  Os operadores lógicos do Pascal são os seguintes:   A seguir, serão apresentadas as tabelas-verdade para cada tipo de operação lógica citada. Uma tabela verdade é uma tabela contendo todas as combinações de valores possíveis para as entradas (operandos) e a respectiva saída.
  A atribuição de falso é representada pelo valor 0, enquanto que o verdadeiro vale 1.

  Tabelas-verdade para duas entradas (exceto o not):
NOT
Entrada Saída
A S
0 1
1 0
AND
Entradas Saída
A B S
0 0 0
0 1 0
1 0 0
1 1 1
OR
Entradas Saída
A B S
0 0 0
0 1 1
1 0 1
1 1 1
XOR
Entradas Saída
A B S
0 0 0
0 1 1
1 0 1
1 1 0

  Para entender melhor o conceito de lógica, vamos trazer para a linguagem formal.
  Suponhamos que eu tenha um ingresso promocional de casal para um encontro de anime, e que só posso entregá-lo a um casal onde ambos gostem de anime e estejam disposto a ir.
  Assim, só posso dar o ingresso (saída verdadeira) para o casal que o homem E a mulher gostem de anime.
  Observando o exemplo a seguir:
var homem_gosta_anime, mulher_gosta_anime, dou_ingresso : boolean;

begin
  dou_ingresso := homem_gosta_anime and mulher_gosta_anime;
end.
  Ao atribuirmos as quatro combinações de entradas (A e B) da tabela-verdade do AND, só obteremos verdadeiro para a variável "dou_ingresso", quando ambas as entradas forem verdadeiras, ou seja, ambos gostem de anime.

  Um exemplo para o OU seria o seguinte: eu necessito de uma caneta para escrever e peço a dois colegas. Se pelo menos um deles me emprestar, poderei escrever.
var amigo1_empresta, amigo2_empresta, posso_escrever : boolean;

begin
  posso_escrever := amigo1_empresta or amigo2_empresta;
end.

  OPERAÇÕES EM CASCATA

  Podemos fazer operações em cascata, respeitando as regras de precedência mencionadas no capítulo de operadores.
  As operações do mesmo nível são feitas da esquerda para a direita. Somente o operador NOT tem precedência pelos demais.
  Ex:
A and B or C
  Primeiramente, fazemos a operação "A and B" e obtemos uma saída S1. A saída S1 servirá de entrada de dados para combinar com C e obter a saída final S. Vamos montar a tabela-verdade:
A AND B
Entradas Saída
A B S1
0 0 0
0 1 0
1 0 0
1 1 1
S1 OR C
Entradas Saída
S1 C S
0 0 0
0 1 1
0 0 0
0 1 1
0 0 0
0 1 1
1 0 1
1 1 1

  Para entender melhor a tabela resultante, veremos como funciona a formação das possíveis combinações das entradas dessa tabela.
  Para formar a tabela das entradas, faz-se o produto cartesiano entre todos os valores dos operandos de entrada.
  No caso de A e B (visto até agora), cada entrada possui dois valores: 0 e 1. Primeiro, combina-se o valor 0 de A com os valores 0 e 1 de B. Depois, combina-se o valor 1 de A com os valores 0 e 1 de B.
  A saída S1 da operação "A and B" irá gerar 4 valores: 0, 0, 0 e 1. Em seguida, S1 será utilizada como entrada para a próxima operação: "S1 or C".
  Será feito então, o produto cartesiano dos elementos de S1 com C. O número de elementos resultante é sempre a multiplicação do número de elementos de cada membro do produto. No caso, temos 4x2 = 8.
  Uma vez montada a tabela de entrada, conforme visto acima, consulta-se a tabela do OR e preenchem-se os valor correspondentes de S, de acordo com cada entrada S1 e C.

  O programa a seguir gerar a tabela verdade da expressão "A and B or C". Observe que ele obtém o resultado diretamente.
var A, B, C : integer;

begin
  for a:=0 to 1 do
  begin
    for b:=0 to 1 do
    begin
      for c:=0 to 1 do
      begin
        writeln(a, ' and ', b, ' or ', c, ' = ', a and b or c);
      end;
    end;
  end;
end.

  OPERAÇÕES LÓGICAS EM NÚMEROS - BIT A BIT

  As operações lógicas podem ser aplicadas a números, geralmente com a finalidade de filtragem de dados.
  Quando fazemos uma operação lógica de um número em relação a outro, convertemos os números para o sistema de numeração binário e, em seguida, aplicamos a operação lógica bit a bit.
  O exemplo a seguir demonstrará como é feito o processo.
13 and 6
  O primeiro passo é converter os números para o sistema binário.
1101 and 0110
  Em seguida, aplicamos a operação lógica a cada posição de bit correspondente entre os números, conforme é mostrado a seguir, ilustrado em cores diferentes.
3210  -> Número do bit

1101  -> 1 1 0 1
0110  -> 0 1 1 0
  Aplica-se a operação lógica E aos números assinalados em vermelho, 1 and 0, e obtém-se o valor 0 para o bit mais significativo.
  Depois, aplica-se a operação lógica E para os números assinalados em verde, 1 and 1, obtendo-se 1.
  Aplica-se a operação lógica E para os números assinalados em azul, 0 and 1, obtendo-se 0.
  Finalmente, aplica-se a operação lógica E para os números assinalados em preto, 1 and 0, obtendo-se 0 para o número menos significativo.
  Assim:
    1101  -> 1 1 0 1
and 0110  -> 0 1 1 0
    ----
    0100  -> 0 1 0 0
  O valor binário 0100 corresponde ao número 4 em decimal. Assim, 13 and 6 é igual a 4.

  Conforme dito anteriormente, uma das utilizades da operação lógica com números é a filtragem de dados.
  De acordo a tabela-verdade do E (and), observa-se que, quando o valor 0 está presente, o resultado é sempre 0. Quando o valor 1 está presente, o resultado depende do outro operando. Dessa forma, podemos criar uma máscara de modo a "zerar" os bits que desejarmos e manter os demais.
  O exemplo a seguir, obtém o valor puro dos bits 0, 1 e 2, quaisquer sejam os valores dos demais bits.
    10100011 -> Número
and 00000111 -> Máscara
    --------
    00000011 -> Resultado
  Na seção de operadores, há um exemplo de filtragem de um código de cores da screen 8 do MSX.


  2. Testes lógicos

  Os operadores de teste lógicos no Pascal são os seguites:   O teste é realizado a partir de dois operandos, resultando sempre em um resultado booleano (verdadeiro ou falso). Ex:
var teste : boolean;

begin
  teste := 4 > 3;
end.
  O resultado para o teste acima é verdadeiro (ou 1). Poderíamos fazer também o seguinte teste:
  teste := 4 < 3;
  Onde o resultado é falso (ou 0).

  O objetivo dos testes lógicos em programas é de tomar decisões e mudar o caminho de execução. Exs:
if (peso > 80) then ...    { Se = decisão }
while (loop = true) do ... { Enquanto loop é verdadeiro ou SE loop é verdadeiro = decisão }
  Os testes lógicos podem ser combinados com os operadores lógicos and, or, not e xor. Ex:
if (idade <= 10) and (altura <= 1.20) then
begin
  writeln('Pode brincar no parquinho');
end;
  Vendo a tabela-verdade do E (and) em um exemplo prático, observamos que se uma criança tiver mais de 10 anos ou for mais alta que 1,20 metros, não poderá entrar no parquinho. Somente quando atender as duas requisições.


/MARMSX/CURSOS/PASCAL