Você está na página 1de 31

"Lógica de Programação" não existe

(mas calma, eu vou explicar)

Paulo Torrens
paulotorrens@gnu.org

Departamento de Ciência da Computação


Centro de Ciências e Tecnologias
Universidade do Estado de Santa Catarina

20 de Outubro de 2017

20 de Outubro de 2017 "Lógica de Programação" não existe 1 / 31


AVISO

• Não sou um profissional da educação, e, portanto, não irei


opinar sobre o ensino de programação em escolas ou
universidades
• O propósito dessa apresentação é tratar alguns mitos gerados
em torno do que são linguagens de programação e computação
em si
• Por favor, não me processe
• Eu sou um amor de pessoa

20 de Outubro de 2017 "Lógica de Programação" não existe 2 / 31


Introdução

• A internet permite o ensino auto-direcionado, e muitas pessoas


a usam a fim de aprender sobre muitos temas, inclusive ciência
da computação
• E também para postar fotos de gatos
• “Eu quero aprender a programar, por onde eu começo?”
• “Comece com lógica de programação, e parta daí!”
• Dessa premissa, um mito em particular surgiu, se tornando
bastante forte por iniciantes na área de informática...

20 de Outubro de 2017 "Lógica de Programação" não existe 3 / 31


O problema

“É só aprender lógica de
programação que você aprende
todas as linguagens, só muda a
sintaxe.”

20 de Outubro de 2017 "Lógica de Programação" não existe 4 / 31


O problema

20 de Outubro de 2017 "Lógica de Programação" não existe 5 / 31


O problema

• “Mas toda linguagem tem variáveis!”


• Não é verdade.
• “Mas toda linguagem divide o programa em funções!”
• Não é verdade.
• “Mas toda linguagem precisa ter estruturas de repetição!”
• Não precisa.
• “Mas toda linguagem precisa ter pelo menos condicional!”
• Não precisa.

20 de Outubro de 2017 "Lógica de Programação" não existe 6 / 31


“Lógica de Programação”

• Linguagens de programação são linguagens formais usadas


para representar computações
• Para tal, tem suas raízes em sistemas lógicos formais (lógica
de predicados, lógica intuicionista, lógica temporal...)
• Não existe uma definição formal para o que significa “lógica de
programação”
• Informalmente, se refere a “lógica de programação” o estudo de
fluxogramas e sequências lógicas para a criação de algoritmos...
• ...que são uma sequência de operações para se computar algo...
• Mas o que exatamente é uma computação?

20 de Outubro de 2017 "Lógica de Programação" não existe 7 / 31


Tese de Church-Turing

• Uma função computável é algo que pode ser calculado por um


ser humano com papel e caneta
• É possível descrever um conjunto de regras tais quais podem
ser usadas como base para computar qualquer coisa que seja
computável
• Chamamos tais conjuntos de regras de modelos de
computação
• Exemplos: a máquina de Turing e o cálculo lambda
• Esses conjuntos são todos equivalentes!
• É possível simular uma máquina de Turing no cálculo lambda...
• É possível simular o cálculo lambda numa máquina de Turing...
• É possível simular ambos com papel e caneta...
• E ambos podem computar qualquer coisa computável!

20 de Outubro de 2017 "Lógica de Programação" não existe 8 / 31


Tese de Church-Turing

• Infelizmente isso também nos ensinou que há problemas que


não são computáveis
• Exemplo: a partir da descrição de uma gramática de uma
linguagem qualquer, decidir (SIM ou NÃO) se é possível existir
ambiguidade na linguagem.
• Não é possível escrever um programa que resolva isso numa
máquina de Turing...
• Não é possível escrever um programa que resolva isso no
cálculo lambda...
• Não é possível escrever um programa de computador que
resolva isso...
• E não é possível resolver isso com papel e caneta.

20 de Outubro de 2017 "Lógica de Programação" não existe 9 / 31


A máquina de Turing

• Um experimento mental feito por Alan Turing: uma máquina


teórica com uma fita infinita e um cabeçote capaz de ler e
modificar símbolos escritos na fita.
• Famosa como predecessora do computador moderno
• A máquina é capaz de executar programas através das
informações contidas na fita, que servem como entrada e
memória para a máquina

20 de Outubro de 2017 "Lógica de Programação" não existe 10 / 31


A máquina de Turing

20 de Outubro de 2017 "Lógica de Programação" não existe 11 / 31


A máquina de Turing

Uma máquina de Turing M = (K , Σ, δ, k0 , F ), onde


• K é um conjunto finito de estados
• Σ é um conjunto finito de símbolos (alfabeto)
• δ é uma função total de transição, de tipo
K×Σ → K×Σ×{←, −, →}
• k0 ∈ K é o estado inicial
• F ⊆ K são os estados de parada

20 de Outubro de 2017 "Lógica de Programação" não existe 12 / 31


A máquina de registradores

• Além da máquina de Turing, temos outros modelos de


computação, como a máquina de registradores
• A RASP (Random-Access Stored-Program), uma variante das
máquinas de registradores, é um modelo de computação,
definido formalmente, onde temos uma quantidade de
memória endereçável de forma randômica, cujos símbolos na
memória podem ser interpretados como um programa para a
própria, interpretados como instruções na função de transição
• Soa familiar?

20 de Outubro de 2017 "Lógica de Programação" não existe 13 / 31


A máquina de registradores

• Processadores usuais são implementações físicas de máquinas


de registradores, e são programados de forma similar com
código de montagem (assembly )
• Os fluxogramas que costumam ser vistos em “lógica de
programação”, junto com as estruturas de repetição, são
traduzidas bem para esse modelo de computação...
• Temos o conceito de memória mutável, ordem de execução,
condicionais...
• ...que, ironicamente, dificultam a programação paralela
• Entretanto, esse não é o único modelo de computação útil
para a programação!

20 de Outubro de 2017 "Lógica de Programação" não existe 14 / 31


Antes de continuar...

• O padrão da linguagem C define sua própria máquina abstrata,


programas em C não são feitos para uma máquina real
• Embora não seja formalizado pelo padrão, a C Abstract
Machine é um tipo de máquina de registradores
• O significado dos programas, então, costuma mudar de acordo
com o hardware real (e pode mudar drasticamente de acordo
com os níveis de otimização)
• A linguagem C é, por isso, considerada uma linguagem de alto
nível (que pode ser usada mesmo em máquinas sem acesso
randômico de memória)
• Não é possível sequer comparar dois ponteiros (<, >) em C!

20 de Outubro de 2017 "Lógica de Programação" não existe 15 / 31


O cálculo lambda

• O cálculo lambda, conhecido por ser a base das linguagens de


programação funcionais como Scheme e Haskell, foi feito por
Alonzo Church, orientador de doutorado de Turing
• Se trata de um sistema de reescrita de termos, e tem relação
com a lógica intuicionista
• Tudo são funções!
• Tudo que você pode fazer é criar funções de um parâmetro
• E invocar essas funções passando outras funções como
argumentos

20 de Outubro de 2017 "Lógica de Programação" não existe 16 / 31


O cálculo lambda

e ::= x | λx.e | e e

20 de Outubro de 2017 "Lógica de Programação" não existe 17 / 31


O cálculo lambda

• Mas como posso programar sem variáveis, sem estrutura de


repetição?

ZERO = λf .λx . x
ONE = λf .λx . f x
TWO = λf .λx . f (f x)
THREE = λf .λx . f ( f ( f x ))
FOUR = λf .λx . f ( f ( f ( f x )))

TRUE = λt .λe . t
FALSE = λt .λe . e
IF = λp .λt .λe . p t e

Y = λf .(λx . f ( x x )) (λx . f ( x x ))

20 de Outubro de 2017 "Lógica de Programação" não existe 18 / 31


O cálculo lambda

SUCC = λn .λf .λx . f ( n f x )


PRED = λn .λf .λx . n (λg .λh . h ( g f )) (λu . x ) (λu . u )

ADD = λm .λn .λf .λx . m f ( n f x )


SUB = λm .λn .( n PRED ) m

IZ = λn . n (λx . FALSE ) TRUE


LEQ = λm .λn . IZ ( SUB M N )

FIB = Y (λr .λn . IF ( LEQ n ONE )


ONE
( ADD ( r ( PRED n ))
( r ( SUB n TWO ))))

20 de Outubro de 2017 "Lógica de Programação" não existe 19 / 31


O cálculo lambda

• Linguagens funcionais são baseadas no cálculo lambda,


embora, por motivos de performance, possuam números e
recursão como primitivos, por motivos de desempenho
• Mas algumas coisas são mantidas: não há mutabilidade,
variáveis jamais são alteradas depois de definidas, funções são
criadas e passadas como argumentos, funções capturam seus
contextos, etc
• Existem linguagens que permitem a alteração de variáveis,
permitindo estilo funcional e imperativo, como OCaml,
Standard ML e Common Lisp
• Muito úteis para programação paralela
• Usadas por empresas como Microsoft e Facebook

20 de Outubro de 2017 "Lógica de Programação" não existe 20 / 31


O cálculo lambda

take2 =
filter ((==2) ◦ length ) ◦ map ( take 2) ◦ tails

doLZW _ [] = []
doLZW as ( x : xs ) =
lzw ( map return as ) [ x ] xs
where
lzw a w [] = [ fromJust $ elemIndex w a ]
lzw a w ( x : xs ) =
if w ’ ∈ a then
lzw a w ’ xs
else
let rest = lzw ( a + + [w ’]) [ x ] xs
in fromJust ( elemIndex w a ) : rest
where w ’ = w + + [x]

20 de Outubro de 2017 "Lógica de Programação" não existe 21 / 31


O cálculo de objetos

• Embora linguagens orientadas a objetos tenham sido criadas


antes de formalismos, alguns foram criados para ajudar a
estudar as linguagens formalmente, como o cálculo de objetos
• Tudo são objetos!
• Apenas criar objetos e enviar mensagens para tais
• Pode ser visto como fundamentação para linguagens
puramente orientadas a objetos, como Smalltalk e Self
• Da mesma forma que no cálculo lambda, não há a necessidade
de condicionais como primitivos, pois podem ser representados
com objetos (TrueClass, FalseClass)
• Diferente do cálculo lambda, o cálculo de objetos é imperativo
e permite alterar variáveis (e então pode representar coisas
como estruturas de repetição, que passam a ser mensagens
para um objeto)

20 de Outubro de 2017 "Lógica de Programação" não existe 22 / 31


O cálculo pi

• O cálculo pi é um dos modelos de computação usado para


representar processos paralelos
• Tudo é um processo!
• Tudo que você pode fazer é criar processos, e enviar processos
entre canais
• Serve como base para linguagens de programação distribuídas,
como Erlang
• Que, por sinal, é usada para o chat do Facebook e o WhatsApp
• Não há repetição nem mutabilidade

20 de Outubro de 2017 "Lógica de Programação" não existe 23 / 31


Lógica combinatória

• Semelhante ao cálculo lambda, mas, ao invés de declarar


funções explicitamente, elas são criadas sem nomear as
variáveis combinando algumas funções pré-existentes
(chamadas de combinadores) como S, K e Y
• Serve como base para linguagens como Forth e Joy, e é usado,
por exemplo, para programação de BIOS

20 de Outubro de 2017 "Lógica de Programação" não existe 24 / 31


Lógica combinatória

: dragon ( depth dir -- )


over 0= if 2 fd 2 drop exit then
dup rt
over 1 - 45 recurse
dup 2* lt
over 1 - -45 recurse
rt drop ;

20 de Outubro de 2017 "Lógica de Programação" não existe 25 / 31


Lógica de predicados

• A lógica de predicados funciona através da unificação; embora


seja um formalismo lógico, serve como linguagem de
programação e é a base para linguagens reais como Prolog
• Não conta com mutabilidade, e condicionais são oferecidas
como opções de unificação
• A programação é não-determinística: você trabalha com um
conjunto possível de soluções (cujo tamanho pode ser zero)
• Útil para inteligência artificial e bancos de dados

20 de Outubro de 2017 "Lógica de Programação" não existe 26 / 31


Lógica de predicados

solution ( [ ] ) .

s o l u t i o n ( [ X/Y | O t h e r s ] ) :−
s o l u t i o n ( Others ) ,
member (Y , [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ) ,
n o a t t a c k (X/Y , O t h e r s ) .

n o a t t a c k (_ , [ ] ) .

n o a t t a c k (X/Y , [ X1/Y1 | O t h e r s ] ) :−
Y =\= Y1 ,
Y1 − Y =\= X1 − X ,
Y1 − Y =\= X − X1 ,
n o a t t a c k (X/Y , O t h e r s ) .

20 de Outubro de 2017 "Lógica de Programação" não existe 27 / 31


Lógica temporal

• É possível programar com o conceito de tempo: variáveis são


possuem valores únicos, porém um fluxo de valores através do
tempo
• Os valores são propagados de acordo com as entradas do
programa, através de instantes (de forma contínua ou discreta)
• Como o conceito de tempo é explícito, é possível que o
programa recalcule apenas os pedaços necessários
• Útil para ferramentas de tempo real e para a programação de
interface de usuários

20 de Outubro de 2017 "Lógica de Programação" não existe 28 / 31


Circuitos quânticos

• Circuitos quânticos são um modelo de computação


implementável através de computadores quânticos
• Novamente equivalente a todos os outros modelos de
computação, embora exponencialmente mais rápido
• Permite que variáveis estejam em mais de um estado ao
mesmo tempo
• Porém informação nunca pode ser duplicada!

20 de Outubro de 2017 "Lógica de Programação" não existe 29 / 31


Conclusões

20 de Outubro de 2017 "Lógica de Programação" não existe 30 / 31


Dúvidas?

20 de Outubro de 2017 "Lógica de Programação" não existe 31 / 31

Você também pode gostar