Teoria da Computa¸ c˜ ao aula 14: Predicados recursivos recursivos primitivos
1
Intr Introd odu uc ¸˜ ao
Na aula passada, n´os os mostramos como definir algumas fun¸c˜ coes o˜es aritm´eticas eticas simples no formal f ormalismo ismo P R. O desenvolvimento natural, a seguir, seria mostrar como essas fun¸c˜ c˜oes oes podem ser utilizadas para definir fun¸c˜ coes o˜es mais mais comp comple lexa xas. s. Ma Mas, s, ante antess diss disso, o, n´os os precisamos precisamos introduzir algumas ferramentas uteis. u ´teis. Um elemento essencial para a constru¸c˜ cao ˜ao de fun¸c˜ c˜oes oes complexas consiste em testar condi¸c˜ c˜oes oes e fazer a fun¸c˜ c˜ao ao se comportar de maneiras diferentes em situa¸c˜ c˜oes oes diferentes. Por exemplo, uma fun¸c˜ c˜ao ao que ´e capaz de distinguir distinguir se o seu argumento argumento x ´e par ou ´ımpar, ımp ar, retorn ret ornand andoo x + 2 no primeiro caso e x + 1 no segundo caso, calcula o sucessor par do n´ umero umero x, o que talvez seja util u ´ til algum dia. Para isso, hoje n´os os vamos mostrar como trabalhar com predicados e conectivos l´ ogicos no formalismo P R. Um predicado ´e simplesmente uma fun¸c˜ c˜ao ao que retorna apenas os valores 0 ou 1. Informalmente, assumimos que o n´umero umero 0 corresponde ao valor l´ ogico ogico Falso, e que que o n´ umero umero 1 corresponde ao valor l´ogico ogico Verdadeiro. 2
Algu Alguns ns pred predic icad ados os uteis u ´ teis
A seguir, temos alguns exemplos de predicados simples que podem ser definidos utilizando o formalismo das fun¸c˜ c˜oes oes recursivas primitivas. c˜aao S o S g 1 definida por a. Nosso primeiro predicado ´e a fun¸c˜ Sg( Sg (x) =
0 , se x = 0 1 , cas caso o con contr tr´ ario a´rio
Informalmente, n´os os podemos imaginar que a fun¸c˜ c˜ao S ao S g (signal , em inglˆes) es) retorna o “sinal” de um n´umero umero natural. Isto ´e, e, ela indica se o n´ n umero u ´ mero ´e diferente de zero (positivo) ou igual a zero (negativo). Vamos definir o predicado Sg utilizando a regra de recurs˜ao ao primitiva. O caso ca so base ´e f´acil, acil, e, para o caso geral, podemos utilizar qualquer fun¸c˜ c˜ao ao aritm´ a ritm´etica etica que sempre se mpre retorne retor ne o valor 1. Isso nos d´a algo como:
Sg( Sg (0)
= z (x)
Sg( Sg (x + 1) = 1(x) = 1 u21 (x,Sg( x,Sg (x))
⋄
b. O predicado Z (x) se comporta de maneira inversa ao anterior, e indica se o argumento x
´e igual igua l a zero. Esse exemplo tamb´ em em poderia p oderia ser definido por meio da recurs˜ao ao primitiva, mas podemos escrever simplesmente
· S g (x) Z (x) = 1 − ⋄
1
Para distingu distin gu´ ´ı-los das fun¸c˜ coes o ˜es aritm´eticas, etica s, n´ os vamos utilizar letras mai´ os usculas para denotar os predicados usculas
1
os vamos definir o predicado Evev(x), que indica se o argumento x ´e um n´ umero c. A seguir, n´ 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 n˜ ao ´e par. Portanto, se temos o valor de Even(x), basta inverte-lo para obter o valor de Even(x + 1). A defini¸c˜ao completa fica assim:
Even(0)
= 1(x) · Even(x) = sub(1(u11 (x,Even(x))), u22 (x,Ev(x))) Even(x + 1) = 1 −
⋄ e f´acil definir o predicado Odd(x), que indica se o d. Uma vez que temos o predicado Even, ´ argumento x ´e um n´ umero ´ımpar, como
· Even(x) Odd(x) = 1 − ⋄ e maior do que o argumento y . e. O predicado Gt(x, y) (greater than ) indica se o argumento x ´ Como j´ a mostramos na aula passada a defini¸c˜ao da opera¸c˜ao de subtra¸c˜ao no formalismo · y ´e diferente PR, basta utilizar o predicado Sg para verificar se o resultado da subtra¸c˜ao x − de zero: · y) Gt(x, y) = Sg(x −
⋄ f. O predicado E q (x, y) indica se o argumento x ´e igual ao argumento y.
Utilizando uma ideia semelhante ao exemplo anterior, n´os podemos escrever: Eq (x, y) = Z (|x − y|) onde a fun¸c˜ao | x − y | foi definida na aula passada. 2.1
⋄
Conectivos booleanos
Da mesma maneira que as fun¸co˜es aritm´eticas complexas s˜ao obtidas pela combina¸c˜ao de fun¸c˜oes aritm´eticas mais simples, os predicados complexos correspondem a proposi¸c˜oes l´ogicas que combinam predicados simples utilizando os conectivos de nega¸cao ˜ (¬), conjun¸cao ˜ (∧) e disjun¸cao ˜ (∨). Antes de colocar essa ideia em pr´atica, ´e preciso mostrar que essas opera¸c˜oes l´ogicas b´asicas correspondem a fun¸c˜oes recursivas primitivas. ao predicados recursivos primitivos. Ent˜ ao, os predicados Teorema 1: Suponha que P e Q s˜
¬P , P ∧ Q e P ∨ Q tamb´em s˜ao recursivos primitivos. Prova: Para ver que ¬ P e P ∧ Q s˜ao recursivos primitivos, observe que
· P (x) ¬P (x) = 1 −
P ∧ Q (x) = P (x) · Q(x)
e
Finalmente, para ver que P ∨ Q tamb´em ´e recursivo primitivo, basta aplicar a lei de Morgan:
P ∨ Q (x) = ¬ ¬P ∧ ¬Q (x)
2
Agora que temos os conectivos l´ogicos, ´e f´acil mostrar que os seguintes predicados tamb´ em s˜ao recursivos primitivos: e diferente de y. g. N eq (x, y): indica se x ´ Neq (x, y) = ¬Eq (x, y)
⋄ e maior ou igual a y . h. Gte(x, y): indica se x ´ Gte(x, y) = Gt(x, y) ∨ Eq (x, y)
⋄ 3
Esquema de defini¸ c˜ ao por casos
Um recurso bastante u ´ til quando especificamos uma fun¸c˜ao consiste em utilizar express˜ oes diferentes para descrever o seu comportamento em diferentes partes do dom´ınio. Por exemplo, a fun¸c˜ao sucessor par mencionada na Introdu¸c˜ao:
sp(x) =
x + 2 , se x ´e par x + 1 , se x ´e ´ımpar
Esse esquema ´e conhecido como defini¸cao ˜ por casos , e temos o seguinte resultado: a o, a Teorema 2: Suponha que g, h ∈ PR, e que P ´e um predicado recursivo primitivo. Ent˜ fun¸c˜ao f (x1, . . . , xn ) =
g(x1 , . . . , xn ) , se P (x1 , . . . , xn ) h(x1 , . . . , xn ) , caso contr´ario
tamb´em ´e recursiva primitiva. Prova: Basta observar que
f = g · P + h · ¬P
Exemplo
ao sucessor par pode ser obtida como uma aplica¸c˜ao direta desse resultado: i. Agora, a fun¸c˜ sp(x) =
x + 2 , se E v(x) x + 1 , caso contr´ ario
⋄ 3.1
Aplica¸ c˜ ao: a opera¸ c˜ ao de divis˜ ao em PR
Quando n´ os apresentamos, na aula passada, as defini¸c˜oes em PR para diversas opera¸co˜es aritm´eticas, uma not´avel omiss˜a o foi a opera¸ca˜o de divis˜a o. A seguir, n´ os veremos que essa opera¸c˜ao de fato requer um pouco mais de recursos para ser definida. Vamos come¸car com o caso mais simples da divis˜a o por 2.
3
j. d2 (x) = ⌊ x2 ⌋
Essa fun¸c˜ao pode ser definida pela regra de recurs˜ao primitiva, incrementando o valor da fun¸c˜ao uma vez a cada duas itera¸co˜es da recurs˜ao. Essa ideia pode ser implementada utilizando o predicado E v(x) e o esquema de defini¸c˜ao 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 ent˜ ao (x + 1) ´e par e da´ı que d2 (x + 1) = d 2 (x) + 1. Por exemplo, 6 5 = 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, 7 6 = 3 = 2 2 ⋄
N˜ ao ´e dif´ıcil ver que essa ideia tamb´ em pode ser utilizada para calcular a divis˜a o por 3. Mas, para isso, ´e preciso definir mod 3 (x), que calcula o resto da divis˜ao por 3. Essa fun¸c˜ao tem uma l´ogica muito parecida com o predicado Ev(x). l. mod3 (x) : calcula o resto da divis˜ao de x por 3
Se examinarmos a defini¸c˜ao do predicado Ev(x), podemos ver que ela efetivamente calcula uma sequˆencia da forma: 1, 0, 1, 0, 1, 0, 1, 0, . . . onde o u ´ ltimo elemento da sequˆ encia ´e igual a 1 se e somente se o n´umero x ´e par. Essa observa¸c˜ao nos d´a a ideia de que, para calcular o resto da divis˜ao por 3, basta calcular uma sequˆencia da forma: 0, 1, 2, 0, 1, 2, 0, 1, . . . onde o u ´ ltimo elemento da sequˆencia ´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 contr´ario
⋄ Uma vez que a fun¸c˜ao mod 3 (x) esteja definida obtemos imediatamente o predicado que indica se o argumento ´e divis´ıvel por 3: Div 3(x) = Z (mod3 (x)) e tamb´em a opera¸c˜ao de divis˜ao 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 mod 3 (a) = 2 b
, caso contr´ ario
⋄ Exerc´ıcios 1. Generalize o resultado da Se¸c˜ao 4 definindo, para k ∈
N fixo,
a fun¸ca˜o d k (x) = ⌊x/k⌋.
2. Apresente uma defini¸c˜ao no formalismo P R para a opera¸ca˜o de divis˜ao: div(x, y) = ⌊ xy ⌋
5