Teoria da Computação
(ENG10395)
Profa. Juliana Pinheiro Campos
E-mail: jupcampos@gmail.com
TEORIA DA COMPUTAÇÃO
Funções recursivas
Os formalismos usados para especificar algoritmos
podem ser classificados nos seguintes tipos:
• Operacional: define-se uma máquina abstrata
baseada em estados, em instruções primitivas e
na especificação de como cada instrução modifica
cada estado. Ex: MT.
• Axiomático: Associam-se regras às componentes
da linguagem. As regras permitem afirmar o que
será verdadeiro após a ocorrência de cada
cláusula, considerando-se o que era verdadeiro
antes da ocorrência. Ex: gramática.
TEORIA DA COMPUTAÇÃO
Funções recursivas
• Denotacional ou funcional: Trata-se de uma
função construída a partir de funções elementares
de forma composicional, no sentido em que o
algoritmo denotado pela função pode ser
determinado em termos de suas funções
componentes. Ex: funções recursivas parciais (de
Stephen C. Kleene) e cálculo lambda (de Alonzo
Church)
TEORIA DA COMPUTAÇÃO
Funções recursivas de Kleene (ou funções
recursivas parciais)
São funções construídas sobre 3 funções naturais básicas
(funções recursivas primitivas):
• natural zero visto como uma função • sucessor (de um número natural)
• projeção (na realidade, uma família de funções, pois depende do n° de componentes, bem como de qual componente deseja-se projetar)
juntamente com as seguintes operações:
• substituição composicional (generaliza o conceito usual de composição de funções)
TEORIA DA COMPUTAÇÃO
Funções recursivas de Kleene (ou funções
recursivas parciais)
• recursão (definição de uma função em termos
dela mesma)
• minimização (busca, em um tempo finito, o menor
valor para o qual uma certa condição ocorre)
constituindo uma forma compacta e natural para definir
muitas funções e suficientemente poderosa para
TEORIA DA COMPUTAÇÃO
Definição por indução de funções recursivas
Quando você aprendeu a operação de exponenciação
pela primeira vez provavelmente foi da forma:
x
n= x . x . … . x (n vezes)
Essa forma é bem simples de entender. Mais tarde você
aprendeu uma definição própria por indução:
x
0= 1
x
n+1= x
n. x
TEORIA DA COMPUTAÇÃO
Definição por indução de funções recursivas
Na sua forma mais simples, a definição de uma função f
por indução a partir de uma outra função g é da forma f(0) = m
f(n + 1) = g(f(n))
A partir de agora, consideramos funções que podem ser
obtidas usando a indução e a composição, começando por algumas que são obviamente computáveis.
Para Associe
0 f(0) = m
1 f(1) = g(m)
TEORIA DA COMPUTAÇÃO
Definição das funções recursivas primitivas
As funções primitivas são incontestavelmente
computáveis. São elas:
• Função constante zero
fzero: N → N tal que, ∀ x Є N, fzero(x) = 0 • Sucessor
sucessor: N → N tal que, ∀ x Є N, sucessor(x) = x + 1 • Projeção
proj ki: Nk → N tal que ∀ (x
1, …, xk) Є Nk, proj ki (x1, …,
xk) = xi para 1 <= i <=k (retorna o i-esimo elemento de uma sequencia de k valores)
Ex: proj33: N3→ N (projeção da 3ª componente de uma tripla)
TEORIA DA COMPUTAÇÃO
Definição das funções recursivas primitivas
Elas são usadas para definir todas as outras funções
recursivas parciais.
Todas as funções tratadas serão sempre entre
números naturais.
Algumas vezes as projeções são chamadas funções
de seleção.
Proj1
1é chamada de função identidade e escrita como
id(x) = x.
TEORIA DA COMPUTAÇÃO
Operações básicas
Composição (substituição composicional):
Sejam as funções parciais: g: Nk → N e f
1, f2, ..., fk: Nn →N. A
função parcial: h: Nn → N é a substituição composicional de
funções, ou simplesmente substituição de funções, definida a partir de g, f1, f2, ... fk como segue:
h(x1, x2, ..., xn) = g(f1(x1, x2, ..., xn), f2(x1, x2, ..., xn), ... fk(x1, x2, ..., xn))
h é dita definida para (x1, x2, ..., xn) se, e somente se:
fi(x1, x2, ..., xn) é definida para todo i Є {1,2,..., k}
g(f1(x1, x2, ..., xn), f2(x1, x2, ..., xn), ... fk(x1, x2, ..., xn)) é
TEORIA DA COMPUTAÇÃO
Operações básicas
Composição (substituição composicional):
Exemplos:
fum: sucessor(fzero) função constante um
fdois: sucessor(fum) função constante dois
ftres: adição(fum, fdois) função constante três
OBS: Para qualquer número natural n a função constante
pode ser definida como a aplicação de n vezes a função sucessor.
TEORIA DA COMPUTAÇÃO
Operações básicas
Recursão primitiva
Sejam as funções parciais: f: Nn →N e g: Nn+2 → N.
A função parcial: h: Nn+1 → N é definida por recursão primitiva
a partir de f e g como segue:
h(x1, x2, ..., xn, 0 ) = f (x1, x2, ..., xn)
h(x1, x2, ..., xn, y + 1) = g(x1, x2, ..., xn, y, h(x1, x2, ..., xn, y)
A função parcial h é dita definida para (x1, x2, ..., xn, ) se, e somente se:
f (x1, x2, ..., xn) é definida
g(x1, x2, ..., xn, i, h(x1, x2, ..., xn, i) é definida para todo i Є
TEORIA DA COMPUTAÇÃO
Operações básicas
Recursão primitiva
Exemplo: A adição é definida usando recursão primitiva: adição(x, 0) = id(x)
adição(x, y+1) = proj33(x, y, sucessor(adição(x, y)))
adição(3,2) = proj33(3, 1, sucessor(adição(3, 1))) = sucessor(adição(3, 1)) = sucessor(proj33(3, 0, sucessor(adição(3, 0)))) = sucessor(sucessor(adição(3, 0))) = sucessor(sucessor(3)) = sucessor(4) = 5
TEORIA DA COMPUTAÇÃO
Operações básicas
Minimização
Seja f:Nn+1→N uma função parcial. A função parcial: h: Nn→N é fita definida por minimização de f e é tal que, ∀(x
1, x2, ..., xn, y) Є Nn+1:
h(x1, x2, ..., xn) = min{y | f(x1, x2, ..., xn, y) = 0 e, ∀z tal que z < y, f(x1, x2, ..., xn, z) é definida}
A função h, para o valor (x1, x2, ..., xn) é definida como o menor natural y tal que f(x1, x2, ..., xn, y) = 0. Adicionalmente, a condição “∀z tal que z < y, f(x1, x2, ..., xn, z) é definida” garante que é
possível determinar, em um tempo finito, se, para qualquer valor z menor do que y, f(x1, x2, ..., xn, z) é diferente de zero
TEORIA DA COMPUTAÇÃO
Operações básicas
Minimização
Exemplo: função número zero. Suponha a função constante fzero. Seja constZero o nº 0 nos naturais (não confundir com a função constante zero):
constZero: 1 → N (função número zero constZero(*)= 0)
Podemos representar também como constZero: → N
Podemos definí-la por minimização da seguinte forma: constZero = min{y | fzero(y) = 0}.
TEORIA DA COMPUTAÇÃO
Funções recursivas
Função recursiva total
Como o próprio nome indica, função recursiva total nada
mais é que uma função recursiva parcial que é total, ou seja, definida para todos os elementos do domínio.
Como podemos ver, as seguintes classes de funções são equivalentes:
funções recursivas parciais e funções turing-computáveis;
funções recursivas totais e funções turing-computáveis totais.
TEORIA DA COMPUTAÇÃO
Funções recursivas
Operações limitadas
Uma vez que estamos limitados aos números naturais, não podemos ter algumas operações convencionais como as operações de subtração e divisão.
A subtração realizada em sala de aula é a subtração limitada m – n = máx{m – n, 0}
A função divisão div(m, n):divisão inteira de m por n pode ser realizada convencionando que o resultado é nulo
TEORIA DA COMPUTAÇÃO
Funções recursivas
Predicado recursivo primitivo: é uma função
recursiva parcial que assume somente os valores 0 e
1.
Exemplo: função e
zero: retorna 1 para o argumento 0 e
0, caso contrário.
e_zero(0) = f
umTEORIA DA COMPUTAÇÃO
Funções recursivas
Predicado recursivo primitivo:
Ex: função maior_ou_igual: maior_ou_igual(m,n) = 1 quando m >= n; e 0 caso contrário.
maior_ou_igual (m, n) = e_zero(sub(n, m)
Ex: E a função menor_que(m,n) como seria?
menor_que(m, n) = fum – maior_ou_igual(m, n)
OBS: A negação de qualquer predicado recursivo também é um predicado recursivo.
TEORIA DA COMPUTAÇÃO
Funções recursivas
Predicado recursivo primitivo:
Resumindo, se f e g são funções recursivas e p é um
predicado recursivo, todos os três com o mesmo
número de argumentos k, então a função definida por
casos
f(n1, …, nk) = g(n1, …, nk), se p(n1, …, nk); f(n1, …, nk) = h(n1, …, nk), caso contrário;
também é recursiva primitiva, uma vez que pode ser
reescrita como:
f(n1, …, nk) = p(n1, …, nk) x g(n1, …, nk) + (1 - p(n1, …, nk)) x h(n1, …, nk) ;