segunda-feira, 20 de agosto de 2012

Algoritmos, introdução à lógica I

A construção de algoritmos exige um bom entendimento de lógica. Pode parecer que um conjunto de instruções sequenciais bem definidas não exija tal conhecimento, porém quando você tem um condicional no meio dessas instruções você acaba na verdade é fazendo um teste lógico, verificando se uma condição é atendida (verdadeira), ou não (falsa). Veja esse simples exemplo:

SE você está apertado, vá ao banheiro, SE NÃO, continue fazer o que estava fazendo.

A condição testada aqui é "você está apertado?" E ela só pode assumir dois valores: "sim eu estou apertado",ou "não eu ainda não estou apertado". (Para fins didáticos, ignorem o "mais ou menos apertado" por enquanto).

Variáveis booleanas:

Uma variável booleana é aquela que só pode assumir um valor de dois: ou ela é zero, ou ela é um, ou ela é sim, ou ela é não... no fundo ou ela é verdadeira, ou então é falsa.

Uma condição a ser testada vai ser sempre booleana, mesmo que contenha uma variável real, inteira ou etc. Veja o exemplo:

x é um número inteiro qualquer;
SE x > 10, ENTÃO você multiplica x por 1,2 ; SE NÃO, você multiplica x por 5.

(Ou seja, se tivermos x = 30, ao fim desse processo x será igual à 36, no entanto se tivéssemos x=5 ao final teríamos x=25 )

Apesar de x ser um número inteiro e 10 também ser a condição "x>10" é booleana. Ou x é verdadeiramente maior que 10, ou então não é.

Átomos:

Não, não estamos falando de física ou química. Em lógica existem átomos, que são as proposições mais simples, sobre as quais você só precisa fazer um teste e que não possuem conectores. "x>10" é um átomo, você só precisa saber se x é maior que 10, não precisa testar outra coisa. "Você está apertado" também é um átomo, afinal, a unica coisa testada e se o sujeito está, ou não, apertado.

Moléculas:

A ideia aqui é a mesma da natureza: átomos se ligam e formam moléculas. Existem situações em que uma unica proposição atômica não descreve uma situação e mesmo que duas ou mais condições sejam testadas separadamente, em sequencia, o resultado obtido não será satisfatório. Veja o exemplo do segurança de uma festa:

"Por causa da legislação local, o segurança da portaria de uma festa recebe a seguinte ordem: Se a pessoa tiver 18 ou mais anos ela pode entrar, se não, se for maior de 16, poderá entrar com autorização dos pais, o resto não entra."

Se usássemos só os átomos:

1.É maior de 18? Então entra, caso o contrário não entra.
2.É maior de 16? Então entra, caso o contrário não entra.
3.Tem autorização? Entrão entra, caso o contrário não entra.

*Maior de, leia como "maior ou igual a".

Parece ok?

Alice é tem 21 anos e não tem autorização dos pais (pois não precisa).
Bianca tem 17 anos e não tem autorização dos pais.
Carolina tem 16 anos e tem autorização dos pais.
Débora tem 15 anos e não tem autorização dos pais.
Eveline tem 14 anos e tem autorização dos pais.

Pela legislação, teoricamente Alice, que é maior de 18 e Carolina, que é maior de 16 e tem a autorização deveriam poder entrar na festa.

MAS:

Alice tem 21 anos, é admitida na primeira etapa e entra, as demais são barradas, inclusive Carolina, que é menor de 18 e portanto é barrada na instrução 1.

E se fizéssemos  2-1-3?

Ai Alice, Carolina e Bianca entram, afinam a condição "2" diz para admitir maiores de 16.

E 3-2-1?

Carolina e Eveline entram, as demais são barradas, afinal ele vai admitir as que tem autorização e recusar as demais.

Ok, é bobo mas é só para exemplificar. Um espertinho poderia argumentar que é possível chegar na resposta certa dizendo:


1.É maior de 18? Então entra, caso o contrário testa 2.
2.É maior de 16? Então testa 3, caso o contrário não entra.
3.Tem autorização? Entrão entra, caso o contrário não entra.

Realmente nesse caso Alice é admitida no teste 1, Débora e Eveline são barradas no teste 2, Caroline é admitida no teste 3 enquanto Bianca é barrada no mesmo teste. Tudo isso usando apenas átomos certo?

Errado! Os testes dentro de testes dá a impressão de estarmos lidando apenas com átomos, mas o que vai definir se uma das garotas vai ser admitida na balada ou não é o conjunto das variáveis booleanas, ou seja do resultado dos testes e não o valor de um átomo.

Na verdade temos apenas um teste para definir se uma guria vai entrar ou não:

1. OU É maior de 18, OU é maior de 16 E nesse caso tem autorização? Se sim entra, se não é recusada.

Nesse caso Alice (maior de 18) e Carolina (maior de 16 e tem autorização) poderão entrar, enquanto as outras que são "menores de 18 E menores de 16, OU na exceção a esse caso sem autorização" não entram.

Conectores:

Não deixei o "E" e o "OU" destacados sem propósito. Quando unimos duas proposições atômicas para formar uma proposição molecular, precisamos usar os conectores para estabelecer uma "regra" de como a molécula será analisada.

Existem dois conectores básicos, o "E" e o "OU":

Conector "E":

O conector "E" funciona como uma intercessão de conjuntos, ou seja, só o que for verdade na interseção entre duas proposições, será verdade numa proposição molecular formada por esse conector. Vamos a um exemplo, será mais fácil compreender assim:

SE é homem E completou 18 anos, você deve procurar a junta de serviço militar mais próxima e se alistar!

A proposição a ser testada, "é homem E completou 18 anos" é uma molécula formada pelos átomos "é homem" e "completou 18 anos". A molécula, nesse caso, só será verdadeira se ambos os átomos forem verdadeiros! Veja:

Alberto é homem e completou 18 anos, como ambos os átomos são verdadeiros a molécula é verdadeira e ele deve se alistar.

Bruno é homem, mas ainda não completou 18, assim apenas o primeiro átomo é verdadeiro, a molécula no entanto é falsa e ele não deve se alistar.

Camila é mulher e completou  18, apenas o segundo átomo é verdadeiro, a molécula é falsa e ela não deve se alistar.

Denise é mulher e ainda não completou 18, ambos os átomos são falsos, a moléculas é falsa e ela não deve se alistar.

Conector "OU":

O conector "OU" funciona como uma união de conjuntos, ou seja, nas condições em que qualquer um dos átomos for verdade a molécula será verdadeira. Observem o exemplo:

SE for maior de 14 OU estiver acompanhada dos pais, a pessoa pode entrar.

Flávia tem 16 anos e veio com os pais, ambos os átomos estão corretos e ela pode entrar.
Gina tem 15 anos e veio sem os pais, o primeiro átomo é verdadeiro e isso basta para ela poder entrar.
Helena tem 12 anos e veio com os pais, o segundo átomo é verdadeiro e isso basta para ela poder entrar.
Iara no entanto tem 11 anos e veio sem os pais, pobrezinha, nenhum dos átomos é verdadeiro, a molécula é falsa e por isso ela não pode entrar.

Conector "NÃO":

O conector "NÃO", não serve para unir átomos e sim para inverter o sentido das proposições. Assim se temos uma proposição "a", NÃO "a" será verdadeira quando "a" for falsa e falsa quando "a" for verdadeira. Exemplo:

SE Abel NÃO estiver lá em cima, procure ele na padaria.

Se Abel estiver "lá em cima", a proposição atômica "Abel está lá em cima" vai ser verdadeira e portanto a molécula "Abel Não está lá em cima" vai ser falsa e o sujeito não deverá ir procurar Abel na padaria.

Ao contrário, se Abel não estiver lá em cima, o átomo vai ser falso a molécula verdadeira e o sujeito vai ter que ir procurar na padaria.

Usando conectores com moléculas:

Da mesma forma que usamos os conectores para unirmos átomos, podemos usa-los para unir átomos à moléculas ou até mesmo unirmos duas moléculas. A ideia do uso dos conectores continua a mesma, no entanto deve se estar atento à ordem das operações lógicas. Os testes devem ser feitos de "dentro" para "fora", começando pelos átomos e terminando nas moléculas mais complexas. Vamos voltar ao exemplo do segurança:

"OU é maior de 18, OU é maior de 16 E nesse caso tem autorização? SE sim entra, SE NÃO é recusada."

Temos aqui uma molécula complexa: "OU É maior de 18, OU é maior de 16 E nesse caso tem autorização ", formada pelo átomo "É maior de 18" e pela molécula "é maior de 16 E tem autorização". Essa última é formada pelos átomos "É maior de 16" e "Tem autorização".

Assim devemos primeiro resolver os átomos mais internos, ou seja:

a = "É maior de 16"
b= "Tem autorização"

SE "a" e "b" forem verdadeiros a molécula c = "é maior de 16 E tem autorização" é verdadeira, nos demais casos ela é falsa. Depois disso temos

c = "é maior de 16 E tem autorização"
d = "É maior de 18"

SE ou "c", ou "d" forem verdadeiros a molécula e = "É maior de 18" e pela molécula "é maior de 16 E tem autorização" será verdadeira.

Negação de moléculas:

O conector "NÃO" preserva sua lógica sobre moléculas, ou seja, ele vai passar o valor oposto ao resultado da mesma. Devemos atentar aqui é que os conectores também se invertem. Veja:

Para ser aceito ele deve ser "forte E inteligente".

Todos os que se enquadram, ou seja, todos que conseguem fazer a molécula "forte E inteligente" são aceitos, os que não conseguem, ou seja, os que fazem a negativa de "forte E inteligente" ser verdadeira são rejeitados.

Mas qual é a negativa de "forte E inteligente"? É "não forte, OU não inteligente". Percebam:

Ariel é forte e é inteligente.
Bernardo é forte, mas não é inteligente.
Carlos não é forte, mas é inteligente.
Douglas não é forte e não é inteligente.

Em Ariel o átomo "é forte" verdadeiro, por isso seu "não é forte" é falso, o mesmo vale para seu "não é inteligente". Como ambos os átomos são falsos a molécula "não é forte, ou não é inteligente" é falsa.

Bernardo tem o átomo "não é forte" falso, mas o "não é inteligente" é verdadeiro e isso é o suficiente para validar a proposição molecular "não forte, OU não inteligente". Com Carlos funciona de forma parecida.

Douglas tem verdadeiro em todas as suas negativas atômicas e por isso a molécula "não forte, OU não inteligente" é verdadeira.

Resumindo, quando for negar uma molécula, negue todos os seus componente e troque os conectores: onde for "E" vira "OU" e onde for "OU" vira "E".

Se houver uma negação dentro da molécula ela deverá ser excluída quando a molécula for negada. Veja o exemplo:

"Isso NÃO é verdadeiro", ou seja, "Isso é falso". A negação dessa molécula é "Isso NÃO NÃO é verdadeiro", que significa "Isso NÃO é falso", que no fim das contas é "Isso é verdadeiro".

Conector OU exclusivo:

Não falei desse conector, porque na verdade ele é uma junção de um conector "OU", um "E" e um "NÃO". Enquanto para o conector "OU" basta que uma das proposições seja verdadeira para que a proposição maior também o seja, já no "OU exclusive" apenas um dos componentes deve ser verdadeiro. Se não for nenhum, ou se forem ambos a proposição é falsa.

Veja o exemplo:

"OU o gato é macho, OU o gato é fêmea". O gato não pode ser macho e fêmea, nem pode ser nem macho nem fêmea.

O OU exclusivo é formado entre duas proposições "a" e "b", usando "(a OU b) E (não a OU não b)"

Veja:
a = verdadeiro ; b = verdadeiro
nesse caso "(a OU b)" = verdadeiro, (não a OU não b) = falso e "(a OU b) E (não a OU não b)" é falso.

a = verdadeiro ; b = falso
(a OU b) = verdadeiro ; (não a OU não b) = verdadeiro
"(a OU b) E (não a OU não b)" = verdadeiro. (o mesmo vale para a = falso ; b = verdadeiro)

a = falso ; b = falso
(a OU b) = falso
(não a OU não B) = verdadeiro
"(a OU b) E (não a OU não b)" = falso.

A negativa do "OU exclusivo" é portanto: "(não a E não B) OU (a E b)", ou seja, quando as duas forem falsas, ou duas forem verdadeiras.

Parece confuso: 

Pode parecer confuso, mas não é. Na próxima postagem (pretendida para 04/09 desse ano) falaremos sobre os sinais lógicos e sobre a tabela verdade, que ajudarão muito a simplificar e resolver problemas lógicos.

Antes de fecharmos eu gostaria também de fazer duas observações:

1º Para fins didáticos eu fiz parecer que é impossível testar só proposições atômicas e que os conectores eram cruciais para casos mais elaborados. Na verdade os conectores não passam de "testes" seguidos.

"a E b"

"a OU b"

2º Os termos aqui foram adaptados para o aprendizado de algoritmos. Existem outros conectores como o conector condicional "SE, ENTÃO" e o bicondicional "SE  E SOMENTE SE", porém não achei interessante tratar deles aqui e dessa forma. O "SE ENTÃO" estamos usando como "teste condicional" e será mais agradável trata-lo não trata-lo diretamente aqui e agora.





Nenhum comentário:

Postar um comentário