Beruflich Dokumente
Kultur Dokumente
c
ao
aula 14: Predicados recursivos primitivos
Introdu
c
ao
Na aula passada, nos mostramos como definir algumas funcoes aritmeticas simples no formalismo
PR. O desenvolvimento natural, a seguir, seria mostrar como essas funcoes podem ser utilizadas
para definir funcoes mais complexas. Mas, antes disso, nos precisamos introduzir algumas
ferramentas u
teis.
Um elemento essencial para a construcao de funcoes complexas consiste em testar condicoes e
fazer a funcao se comportar de maneiras diferentes em situacoes diferentes. Por exemplo, uma
funcao que e capaz de distinguir se o seu argumento x e par ou mpar, retornando x + 2 no
primeiro caso e x + 1 no segundo caso, calcula o sucessor par do n
umero x, o que talvez seja
u
til algum dia.
Para isso, hoje nos vamos mostrar como trabalhar com predicados e conectivos l
ogicos no formalismo PR. Um predicado e simplesmente uma funcao que retorna apenas os valores 0 ou 1.
Informalmente, assumimos que o n
umero 0 corresponde ao valor l
ogico Falso, e que o n
umero
1 corresponde ao valor l
ogico Verdadeiro.
Alguns predicados u
teis
A seguir, temos alguns exemplos de predicados simples que podem ser definidos utilizando o
formalismo das funcoes recursivas primitivas.
a. Nosso primeiro predicado e a funcao Sg 1 definida por
(
0 , se x = 0
Sg(x) =
1 , caso contrario
Informalmente, nos podemos imaginar que a funcao Sg (signal, em ingles) retorna o sinal
de um n
umero natural. Isto e, ela indica se o n
umero e diferente de zero (positivo) ou igual
a zero (negativo).
Vamos definir o predicado Sg utilizando a regra de recurs
ao primitiva. O caso base e facil,
e, para o caso geral, podemos utilizar qualquer funcao aritmetica que sempre retorne o valor
1. Isso nos da algo como:
(
Sg(0)
= z(x)
Sg(x + 1) = 1(x) = 1 u21 (x, Sg(x))
d. Uma vez que temos o predicado Even, e facil definir o predicado Odd(x), que indica se o
argumento x e um n
umero mpar, como
Even(x)
Odd(x) = 1
Conectivos booleanos
Finalmente, para ver que P Q tambem e recursivo primitivo, basta aplicar a lei de Morgan:
P Q (x) = P Q (x)
Esquema de defini
c
ao por casos
Um recurso bastante u
til quando especificamos uma funcao consiste em utilizar expressoes
diferentes para descrever o seu comportamento em diferentes partes do domnio. Por exemplo,
a funcao sucessor par mencionada na Introducao:
(
x + 2 , se x e par
sp(x) =
x + 1 , se x e mpar
Esse esquema e conhecido como definica
o por casos, e temos o seguinte resultado:
Teorema 2: Suponha que g, h PR, e que P e um predicado recursivo primitivo. Entao, a
funcao
(
g(x1 , . . . , xn ) , se P (x1 , . . . , xn )
f (x1 , . . . , xn ) =
h(x1 , . . . , xn ) , caso contrario
tambem e recursiva primitiva.
Prova: Basta observar que
f = g P + h P
Exemplo
i. Agora, a funcao sucessor par pode ser obtida como uma aplicacao direta desse resultado:
sp(x) =
x + 2 , se Ev(x)
x + 1 , caso contrario
3.1
Aplica
c
ao: a opera
c
ao de divis
ao em PR
Quando nos apresentamos, na aula passada, as definicoes em PR para diversas operacoes aritmeticas, uma not
avel omiss
ao foi a operacao de divisao. A seguir, nos veremos que essa
operacao de fato requer um pouco mais de recursos para ser definida.
Vamos comecar com o caso mais simples da divisao por 2.
j. d2 (x) = x2
Essa funcao pode ser definida pela regra de recurs
ao primitiva, incrementando o valor da
funcao uma vez a cada duas iteracoes da recurs
ao. Essa ideia pode ser implementada utilizando o predicado Ev(x) e o esquema de definicao por casos que acabamos de apresentar.
(
d2 (0)
= 0
d2 (x + 1) = g(x, d2 (x))
onde
g(a, b) =
b + 1 , se a e mpar
b
, se a e par
N
ao e difcil ver que essa ideia tambem pode ser utilizada para calcular a divisao por 3. Mas,
para isso, e preciso definir mod3 (x), que calcula o resto da divisao por 3. Essa funcao tem uma
l
ogica muito parecida com o predicado Ev(x).
l. mod3 (x) : calcula o resto da divisao de x por 3
Se examinarmos a definicao do predicado Ev(x), podemos ver que ela efetivamente calcula
uma sequencia da forma:
1, 0, 1, 0, 1, 0, 1, 0, . . .
onde o u
ltimo elemento da sequencia e igual a 1 se e somente se o n
umero x e par.
Essa observacao nos da a ideia de que, para calcular o resto da divisao por 3, basta calcular
uma sequencia da forma:
0, 1, 2, 0, 1, 2, 0, 1, . . .
onde o u
ltimo elemento da sequencia e o resultado que desejamos.
Isso pode ser feito da seguinte maneira:
(
mod3 (0)
= 0
onde
g(a, b) =
z(b) , se b = 2
s(b) , caso contrario
Uma vez que a funcao mod3 (x) esteja definida obtemos imediatamente o predicado que indica
se o argumento e divisvel por 3:
Div3 (x) = Z(mod3 (x))
e tambem a operacao de divisao por 3:
4
m. d3 (x) = x3
(
d3 (0)
= z(x)
d3 (x + 1) = g(x, d3 (x))
onde
g(a, b) =
b + 1 , se mod3 (a) = 2
b
, caso contrario
Exerccios
1. Generalize o resultado da Secao 4 definindo, para k N fixo, a funcao dk (x) = x/k.
2. Apresente uma definicao no formalismo PR para a operacao de divisao: div(x, y) = xy