Anda di halaman 1dari 5

Teoria da Computa

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))

b. O predicado Z(x) se comporta de maneira inversa ao anterior, e indica se o argumento x


e igual a zero. Esse exemplo tambem poderia ser definido por meio da recurs
ao primitiva,
mas podemos escrever simplesmente
Sg(x)
Z(x) = 1

Para distingu-los das funco


es aritmeticas, n
os vamos utilizar letras mai
usculas para denotar os predicados

c. A seguir, nos vamos definir o predicado Evev(x), que indica se o argumento x e um n


umero
par.
A ideia e utilizar a regra da recurs
ao primitiva. O caso base e simples, pois sabemos que 0
e um n
umero par. Assim, vamos definir Even(0) = 1(x). Para o caso geral, basta observar
que x e um n
umero par se e somente se x 1 nao e par. Portanto, se temos o valor de
Even(x), basta inverte-lo para obter o valor de Even(x + 1). A definicao completa fica
assim:
(
Even(0)
= 1(x)
Even(x) = sub(1(u11 (x, Even(x))), u22 (x, Ev(x)))
Even(x + 1) = 1

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

e. O predicado Gt(x, y) (greater than) indica se o argumento x e maior do que o argumento y.


Como ja mostramos na aula passada a definicao da operacao de subtracao no formalismo
y e diferente
PR, basta utilizar o predicado Sg para verificar se o resultado da subtracao x
de zero:
y)
Gt(x, y) = Sg(x

f. O predicado Eq(x, y) indica se o argumento x e igual ao argumento y.


Utilizando uma ideia semelhante ao exemplo anterior, nos podemos escrever:
Eq(x, y) = Z(|x y|)
onde a funcao |x y| foi definida na aula passada.
2.1

Conectivos booleanos

Da mesma maneira que as funcoes aritmeticas complexas s


ao obtidas pela combinacao de funcoes
aritmeticas mais simples, os predicados complexos correspondem a proposicoes l
ogicas que combinam predicados simples utilizando os conectivos de negaca
o (), conjunca
o () e disjunca
o
().
Antes de colocar essa ideia em pratica, e preciso mostrar que essas operacoes l
ogicas basicas
correspondem a funcoes recursivas primitivas.
Teorema 1: Suponha que P e Q s
ao predicados recursivos primitivos. Entao, os predicados
P , P Q e P Q tambem s
ao recursivos primitivos.
Prova: Para ver que P e P Q s
ao recursivos primitivos, observe que

P (x)
P (x) = 1
e
P Q (x) = P (x) Q(x)

Finalmente, para ver que P Q tambem e recursivo primitivo, basta aplicar a lei de Morgan:


P Q (x) = P Q (x)


Agora que temos os conectivos l


ogicos, e facil mostrar que os seguintes predicados tambem s
ao
recursivos primitivos:
g. N eq(x, y): indica se x e diferente de y.
N eq(x, y) = Eq(x, y)

h. Gte(x, y): indica se x e maior ou igual a y.


Gte(x, y) = Gt(x, y) Eq(x, y)

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

A ideia aqui e que, se x e mpar entao (x + 1) e par e da que d2 (x + 1) = d2 (x) + 1. Por


exemplo,
j5k
j6k
= 3 = 2+1 =
+1
2
2
No caso em que x e par temos que (x + 1) e mpar, e portanto d2 (x + 1) = d2 (x). Por
exemplo,
j7k
j6k
= 3 =
2
2

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

mod3 (x + 1) = g(x, mod3 (x))

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