Post on 09-Feb-2017
UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO
PROGRAMAÇÃO DECLARATIVA – 2016.2
Fábio M. Pereira
(fabio.mpereira@uesb.edu.br)
Roteiro
• Linguagens de Programação
• Funções Matemáticas e Programação
• O Que é Programação Funcional?
• Vantagens da Programação Funcional
• Desvantagens
• Programando por Funções
• Implementações
• Comandos Básicos no GHCi
Linguagens de Programação
• Um programa é uma sequência lógica de tarefas, destinada à computadores
• Uma linguagem de programação é usada para escrever programas: – Diretamente em código de máquina
– Em uma linguagem de baixo nível
– Em uma linguagem de alto nível
• O compilador converte um programa em linguagem de alto nível para linguagem de máquina
Linguagens de Programação
• Código de máquina:
• Baixo nível:
• Alto Nível:
00101011 – 2B
01101111 – 6F
ORG $400
MOVE.B Value1,D0
MOVE.B Value2,D1
ADD.B D0,D1
MOVE.B D1,Result
STOP #$2700
program Teste;
var Nome: String;
begin
write('Nome: ');
readln(nome);
writeln('Nome lido do teclado: ',nome);
readln;
end.
Funções Matemáticas
• Define um mapeamento de um domínio de valores para uma “faixa” de valores
• Conjunto de pares ordenados que relaciona cada elemento de um domínio com um elemento correspondente em uma “faixa” (contradomínio)
• O valor de uma função não depende de conceitos como ordem de execução
• Variáveis não mudam de valor
Representam Funções Matemáticas?
Definição de Função
• Dados dois conjuntos A e B não vazios, uma função de A em B é uma relação que associa a cada elemento x A, um único elemento y B
• Assim, uma função liga um elemento do domínio (conjunto A de valores de entrada) com um segundo conjunto, o contradomínio (conjunto B de valores de saída) de tal forma que a cada elemento do domínio está associado exatamente a um, e somente um, elemento do contradomínio
• O conjunto dos elementos do contradomínio que são relacionados pela f a algum x do domínio é o conjunto imagem, denotado por Im(f)
Qual a Função?
f(x) = x2
Dom (f) = {-3, -2, -1, 0} CD (f) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Im (f) = {0, 1, 4, 9}
Quais Diagramas Representam Uma Função de A em B?
(a) (b)
(c) (d)
Funções Matemáticas e Programação
• Simplificando, uma função é uma regra para mapeamento (ou associação) de membros de um conjunto (o conjunto domínio) para outro (contradomínio)
• Exemplo: a função “quadrado” deve mapear elementos do conjunto de números inteiros para o conjunto de números naturais
• A definição de uma função é composta de duas partes
– Assinatura: especifica o domínio e o contradomínio
– Regra de mapeamento: especifica o valor do contradomínio associado com cada valor do domínio
Funções Matemáticas e Programação
• Exemplo
square : integer natural (assinatura)
square(n) n x n (regra de mapeamento)
(é definida por)
n (parâmetro)
square(2) resulta no valor 4, onde “2” é o argumento
“n” é uma variável matemática, que é diferente de uma variável de programação o seu valor não muda
Funções Matemáticas e Programação
• Novas funções podem ser criadas pela combinação de funções
– Composição de funções: F G o H • A aplicação de F é equivalente a aplicação de H e a aplicação de G ao
resultado
• Em Linguagens Imperativas a função é definida de forma procedural
• Em Funções Matemáticas a função é definida de forma aplicativa ou declarativa
– A regra de mapeamento é definida em termos de combinações e aplicações de outras funções
Funções Matemáticas e Programação
• Muitas Funções Matemáticas são definidas recursivamente – A definição da função contém uma aplicação dela mesma
• Fatorial de um número n! if n=0 then 1 else n*(n-1)!
• Função de naturais para booleanos que determina se um número é primo primo(n) if n=2 then true else p(n, n div 2)
p(n,i) if (n mod i) = 0 then false
else if i=1 then true else p (n, i-1)
• Qual a função de naturais para booleanos que determina se um número é par?
Resumindo, O Que É Programação Funcional?
• C, Java, Pascal, Ada, ..., são linguagens imperativas
– Consiste de uma sequência de comandos que são executados estritamente um após o outro
• Haskell é uma linguagem funcional
– Um programa funcional é uma única expressão, que é executada pela avaliação da expressão
• Planilha eletrônica: o valor de cada célula é calculado em função dos valores de outras células
• Foco em o que deverá ser computado, e não em como deverá ser computado.
O Que? X Como?
• Em uma planilha eletrônica:
– Não especificamos a ordem na qual as células devem ser calculadas: a planilha irá automaticamente computar as células em uma ordem que respeite as suas dependências
– Não dizemos a planilha como alocar memória: ela nos apresenta um plano aparentemente infinito de células
– Na maioria das vezes, especificamos o valor de uma célula através de uma expressão em vez de usarmos uma sequência de comandos
Vantagens da Programação Funcional
• Programas muito mais concisos que os seus equivalentes em linguagem imperativa (2-10 vezes)
• Fácil entendimento: você é capaz de entender o programa sem qualquer conhecimento prévio da linguagem
• É uma linguagem fortemente tipada, evitando erros de programação
• Sistema de tipos menos restritivo (polimorfismo): reuso de código
• Funções de alta-ordem: abstração poderosa • Gerenciamento interno de memória
Vantagens da Programação Funcional
qsort [] = []
qsort (x:xs) =
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
qsort( a, lo, hi ) int a[], hi, lo;
{
int h, l, p, t;
if (lo < hi) {
l = lo;
h = hi;
p = a[hi];
do {
while ((l < h) && (a[l] <= p))
l = l+1;
while ((h > l) && (a[h] >= p))
h = h-1;
if (l < h) {
t = a[l];
a[l] = a[h];
a[h] = t;
}
} while (l < h);
t = a[l];
a[l] = a[hi];
a[hi] = t;
qsort( a, lo, l-1 );
qsort( a, l+1, hi );
}
}
Desvantagens
• Programas escritos em linguagens imperativas, como C por exemplo, são geralmente mais rápidos e usam menos memória que programas em Haskell – Em aplicações onde a performance é fundamental, uma
linguagem imperativa seria uma melhor escolha que Haskell
– C oferece maior controle sobre o modo exato como a computação é realizada
Programando por Funções
areaCirculo r = pi*r^2
quadrado x = x * x
maior x y
| x >= y = x
| otherwise = y
Programando por Funções
fatorial 1 = 1
fatorial n = n * fatorial (n-1)
f x = 2 * x + 4
Implementações
• Hugs
– Exclusivamente um interpretador, implementa quase todo o padrão Haskell 98 e algumas extensões
– Escrito em C, funciona em quase todas as plataformas
– Possui uma biblioteca gráfica
– Último release: maio/2006 (sem manutenção)
– https://www.haskell.org/hugs/
Implementações
• GHC
– É tanto um interpretador como um compilador
– O ambiente interativo é mais lento que Hugs, mas permite definição de funções no ambiente (em Hugs deve-se colocar em um arquivo)
– Implementa o Haskell 2010
– Bom suporte a interface com outras linguagens
– Possui interface gráfica
– Último release: dezembro/2014
– https://www.haskell.org/downloads
Implementações
• NHC
– É apenas um compilador
– Produz executável menor e mais rápido que GHC98
– Dá suporte ao Haskell 98 e algumas extensões
– Sem manutenção
• UHC
– Implementação da Utrecht University
– Dá suporte ao Haskell 98 e algumas extensões
• JHC
– Compilador experimental com o objetivo de testar novos métodos de otimização
Haskell GUIs
• Haskell possui pelo menos quatro kits de ferramentas para programação de interface gráfica:
– wxHaskell – fornece uma interface Haskell para o kit de ferramentas multi-plataformas wxWidgets com suporte a Windows, OS X, e Gtk+ no GNU/Linux, dentre outros
– Gtk2Hs – fornece uma interface Haskell para a biblioteca GTK+
– hoc – fornece uma ponte Haskell para Objective-C que permite a usuários acessarem a biblioteca Cocoa no MacOS X
– qtHaskell – fornece um conjunto de pontes Haskell para a Qt Widget Library da Nokia
Comandos Básicos no GHCi
• Ao executar o GHCi, uma sessão é iniciada
• O sistema carrega funções pré-definidas (Prelude.hs) e passa a esperar comandos:
Comandos Básicos no GHCi
• Exemplo de Interação, digitando expressões:
Alguns Comandos Importantes
• :? imprime a lista de todos os comandos
• :q abandona o interpretador
• :load carrega definições a partir de um arquivo
• :e chama o editor
• :e exemplo1.hs editar o arquivo exemplo1.hs
• :l exemplo1.hs carregar o arquivo exemplo1.hs
• :a exemplo2.hs carregar o arquivo exemplo2.hs
• :r recarrega um arquivo modificado
• :m + nomeModulo carrega módulo (biblioteca) para a memória
• :m – nomeModulo remove módulo da memória
• :! comando executar um comando do sistema operacional;
• :set visualiza configurações do GHCi (:s +t)
Operações Aritméticas
• Soma (+), subtração (-), multiplicação (*), divisão (/), exponenciação (^) e raiz quadrada (sqrt)
• Agora tente calcular 2^5000 (irá funcionar?)
Operações Aritméticas
UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO
PROGRAMAÇÃO DECLARATIVA – 2016.2
Fábio M. Pereira
(fabio.mpereira@uesb.edu.br)