Escolar Documentos
Profissional Documentos
Cultura Documentos
6- Procedimentos
Agora temos uma compreensão mais clara das propriedades dos símbolos
←
físicos. No sistema representado, 𝐷 , as entidades podem ser qualquer coisa,
reais ou imaginárias, mas no sistema de representação, Ĝ, os símbolos devem ser
fisicamente instanciados e ter formas distinguíveis. Precisamos agora
compreender as propriedades das funções em P̂ que desempenham um papel
nos sistemas representacionais fisicamente realizados.
Assim como a nossa compreensão dos símbolos em Ŝ mudou quando
consideramos as propriedades físicas desejáveis, o mesmo deve acontecer com a
nossa compreensão das funções em Ŝ. P̂. Neste capítulo exploramos as
propriedades de funções computáveis e fisicamente realizáveis em um sistema
representacional. As funções computacionais são o que permite que as funções
sejam colocadas em uso produtivo, assim como distinguir símbolos e estabelecer
referentes para eles é o que permite que os símbolos sejam colocados em uso
produtivo.
Algoritmos
Conforme discutido no Capítulo 3, as definições de função podem estabelecer
que existe um mapeamento de membros do domínio para membros do
contradomínio sem necessariamente fornecer um método ou processo para
determinar a saída para uma determinada entrada.
Um método ou processo claro e inequívoco que permite determinar
roboticamente os mapeamentos de entrada/saída de uma função é chamado de
algoritmo. Por exemplo, o método de multiplicação longa que as crianças do
ensino fundamental aprendem é um algoritmo para determinar o símbolo do
produto de dois números. Vimos alguns algoritmos geométricos no Capítulo 4,
como o algoritmo para determinar um segmento de linha que é 1/n de outro
segmento de linha, onde n é qualquer número inteiro (Figura 4.1).
Para dar um exemplo comum, digamos que você tenha um suprimento
infinito de moedas, denominadas 25 centavos, 10 centavos, 5 centavos e 1
centavo. Vamos definir uma função de “troco” que mapeia uma quantia de
dinheiro de 99 centavos ou menos para o grupo mínimo de moedas que iguala a
quantia dada. Quarenta e três centavos seriam mapeados para uma das moedas
de 25 centavos, duas das moedas de 10 centavos, uma das moedas de 5 centavos
e três das moedas de 1 centavo. Quarenta e três moedas de 1 centavo dariam a
quantidade certa de troco, mas não o número mínimo de moedas. Essa função é
1
CAP 6 -Procedimentos
2
CAP 6 -Procedimentos
algoritmos com processos que não deixam espaço para interpretação, e não
exigem necessidade de compreensão da língua inglesa. No próximo capítulo,
mostraremos um formalismo, a máquina de Turing, que pode ser usada para
expressar algoritmos de uma forma que não deixe nada aberto à interpretação.
Qualquer algoritmo específico determina uma função; entretanto,
qualquer função específica pode ser determinada por muitos algoritmos
possíveis. Outro algoritmo que determina a função de dar troco é uma tabela de
consulta. Possui 99 entradas. A Tabela 6.1 mostra alguns deles. Para determinar a
função, basta procurar a resposta (saída) na tabela. Se utilizasse esse algoritmo, o
caixa teria um pequeno cartão no qual estavam escritas as moedas que deveriam
ser devolvidas para cada valor de troco possível. O caixa então simplesmente
encontra o troco necessário no cartão e devolve as moedas associadas a ele.
Tabela 6.1 Tabela de consulta parcial para fazer alterações
Alteração devida (em centavos) Grupo mínimo de moedas (em centavos)
3 (1,1,1)
26 (25,1)
37 (25,10,1,1)
66 (25, 25, 10, 5, 1)
80 (25, 25, 25, 5)
3
CAP 6 -Procedimentos
4
CAP 6 -Procedimentos
procedimentos conhecidos para resolvê-las não são práticos, e ainda assim não é
sabemos se essas funções são intratáveis.2*
A falta de procedimentos eficientes para encontrar os fatores primos de
grandes números é a base para muitos dos sistemas de criptografia que
protegem suas informações à medida que elas se movem pela Internet. Esses
esquemas aproveitam o fato de que, embora seja trivial calcular o produto de
quaisquer dois números primos, não importa quão grandes eles sejam, os
procedimentos conhecidos para calcular a função inversa, que especifica para
cada número não primo seus fatores primos , tornam-se inutilizáveis à medida
que os insumos se tornam grandes. Dado um número grande que não é primo,
sabemos que existe um conjunto único de fatores primos e conhecemos
procedimentos que garantem encontrar esse conjunto se for permitido correr
por tempo suficiente, mas para números muito grandes “longo o suficiente” é
maior do que a idade do universo, mesmo quando implementado em um
supercomputador. Funções cujos inversos não podem ser calculados de forma
eficiente são chamadas de funções de alçapão, porque permitem que uma siga
um caminho, mas não o outro.
Resumindo, há uma desconexão entre a definição de uma função e a
capacidade de determinar a saída quando dada a entrada. A desconexão ocorre
nos dois sentidos. Podemos ter um sistema que nos fornece pares de
entrada/saída e ainda assim não temos uma definição/compreensão da função.
A ciência está frequentemente nesta posição. Os cientistas realizam experiências
em sistemas naturais que podem ser considerados entradas e o sistema natural
reage com o que pode ser chamado de saídas. Contudo, os cientistas podem não
ter meios independentes de determinar e, assim, prever a relação entre entradas
e saídas. Os cientistas dizem, nesses casos, que não possuem um modelo do
sistema. Diríamos que não temos um sistema representacional para o sistema
natural.
Codificação e Procedimentos
Como mencionamos anteriormente, o uso de símbolos concatenados que
compartilham um conjunto de elementos de dados (por exemplo, ‘0’ e ‘1’) como
base construtiva sugere que os procedimentos em P̂ poderá tirar vantagem desta
moeda comum de construção de símbolos. Isto não implica, contudo, que a
codificação específica utilizada para os símbolos seja irrelevante no que diz
2* Esta é a classe de funções (muitas vezes bastante úteis) agrupadas sob o título NP Completa.
Se alguma dessas funções tiver um procedimento viável, então todas elas terão. A natureza
tentadora disso faz com que a questão de saber se existe tal procedimento seja viável uma das
questões em aberto mais famosas da ciência da computação, chamada de problema P = NP. O
consenso geral é que estas funções são intratáveis, mas ninguém foi capaz de provar isso
6
CAP 6 -Procedimentos
respeito aos procedimentos. Na verdade, existe uma ligação muito estreita entre
os procedimentos em P̂ e a codificação dos símbolos em Ŝ.
Se o código utilizado for nominal, os símbolos nominais não podem ser
utilizados de forma produtiva aproveitando aspectos da sua forma. Eles só
podem ser usados de forma produtiva em um mapeamento, distinguindo toda a
cadeia de dados (sequência de elementos atômicos) que constitui o símbolo e,
em seguida, usando uma tabela de consulta para retornar o resultado. Isso
ocorre porque a cadeia usada para formar um símbolo nominal é arbitrária –
qualquer cadeia pode ser substituída por qualquer outra sem perda ou ganho de
eficácia referencial. Quando um grande número de símbolos nominais é
utilizado, torna-se impraticável distingui-los. Os símbolos de codificação,
entretanto, podem ser distinguidos eficientemente usando o que chamaremos
de procedimentos compactos.
Para ver a força desta consideração, examinamos sistemas
30
representacionais potenciais envolvendo os inteiros, N = {1, 2,. . . ,10 }, usando
sistemas nominais e de codificação, e duas funções aritméticas, a função de
paridade fé_par: N → {falso, verdadeiro}, e a função de adição f+: N × N → N. Cada
dado (elemento em uma sequência de símbolos) virá do conjunto {'0', '1'}, e
chamamos cada dado de pedaço. Os símbolos para verdadeiro e falso serão ‘1’ e
⊗
‘0’, respectivamente. Nossos procedimentos então serão da forma festá_par :𝐷 →
⊗
{0, 1}, onde𝐷 , a entrada, é uma sequência de bits e a saída é um único bit, e f+ :
⊗ ⊗ ⊗
𝐷 ×𝐷 →𝐷 , onde as entradas são duas sequências de bits e a saída é uma
sequência de bits.
7
CAP 6 -Procedimentos
8
CAP 6 -Procedimentos
Figura 6.1 Árvore de pesquisa binária para determinar a paridade dos primeiros oito inteiros usando a codificação binária
nominal da Tabela 6.2.
Primeiro consideramos um procedimento que distingue os elementos
sequencialmente, movendo-se pela cadeia de entrada da direita para a esquerda.
À medida que avançamos na entrada, mudaremos de estado para estado dentro
do procedimento. Cada estado fornecerá então uma memória do que vimos até
agora. Quando chegarmos ao último símbolo, saberemos qual deve ser a saída
com base no estado em que pousamos. Na verdade, estaremos nos movendo
através de uma árvore de estados (uma árvore de pesquisa binária) que se
ramifica após cada símbolo encontrado. A Figura 6.1 mostra a árvore que
corresponde ao mapeamento nominal dado. Diferentes strings de entrada nos
9
CAP 6 -Procedimentos
1 Leia o bit 1. Se for ‘0’, vá para o estado 2. Se for ‘1’, vá para o estado 3.
2 Leia o bit 2. Se for ‘0’, vá para o estado 4. Se for ‘1’, vá para o estado 5.
3 Leia o bit 2. Se for ‘0’, vá para o estado 6. Se for ‘1’, vá para o estado 7.
4 Leia o bit 3. Se for ‘0’, produza ‘1’. Se for '1', produza '0'. Pare.
5 Leia o bit 3. Se for ‘0’, produza ‘0’. Se for '1', produza '1'. Pare.
6 Leia o bit 3. Se for ‘0’, produza ‘1’. Se for '1', produza '0'. Pare.
7 Leia o bit 3. Se for ‘0’, produza ‘1’. Se for '1', produza '0'. Pare.
10
CAP 6 -Procedimentos
Figura 6.2 Uma memória endereçável por conteúdo torna possível a pesquisa paralela. A string a ser processada é
alimentada na parte superior. Todos os três bits vão simultaneamente para os três nós de entrada em cada local de
memória. Cada nó de entrada é ativado somente se o bit de entrada que ele vê corresponder a ele. Se todos os nós em um
determinado local forem ativados, eles geram o bit de saída armazenado naquele local, o bit que especifica a paridade do
número representado por esse local na memória endereçável por conteúdo. (A ordem dos números binários nesta
ilustração não desempenha nenhum papel no procedimento.)
11
CAP 6 -Procedimentos
Memória de estado
O procedimento sequencial ilustra um conceito de importância central na nossa
compreensão das possíveis arquiteturas de máquinas computacionais, o
conceito de memória de estado. O estado de um dispositivo de computação é
uma capacidade instalada para executar uma função específica em um
determinado contexto. Cada estado implementa essencialmente uma mini tabela
de consulta própria e, ao passar de um estado para outro, uma máquina pode
mapear um conjunto pré-especificado de entradas para um conjunto
pré-especificado de saídas (implementando uma tabela de consulta maior). . A
qualquer momento, ele está em um e apenas um dos seus estados possíveis. O
estado em que se encontra em determinado momento depende do histórico de
entrada, porque diferentes entradas levam a diferentes transições de estado.
Tomemos, por exemplo, uma máquina de escrever (ou, hoje em dia, um teclado,
que não é tão favorável para os nossos propósitos, porque a base física para as
suas mudanças de estado não é aparente). Quando a tecla Shift não foi
pressionada (entrada anterior), ela está em um estado. Nesse estado, ele mapeia
os pressionamentos das teclas para seus símbolos em minúsculas. Quando a
tecla Shift é pressionada, ela mapeia as mesmas entradas para suas saídas em
maiúsculas, porque pressionar a tecla Shift mudou a máquina para um estado
diferente. Em uma máquina de escrever antiga, pressionar a tecla Shift levantava
todo o conjunto de alavancas de percussão, de modo que a parte inferior da
extremidade de cada alavanca atingisse o papel, em vez da parte superior. O fato
12
CAP 6 -Procedimentos
13
CAP 6 -Procedimentos
Leia o bit 1. Se for ‘0’, produza ‘1’. Se for '1', produza '0'. Pare.
15
CAP 6 -Procedimentos
16
CAP 6 -Procedimentos
Procedimentos para f+
Ao trabalhar com símbolos que se referem a uma quantidade, a função de adição
é extremamente útil porque, em muitas circunstâncias, as quantidades se
combinam aditivamente (ou linearmente, como a combinação aditiva é
frequentemente chamada). Como sempre, o procedimento depende da
codificação. Se usarmos um código unário (analógico) - símbolos que possuem
tantos '1's quanto o número inteiro que codificam - o procedimento de adição é
altamente compacto: você obtém o símbolo da soma simplesmente
concatenando (encadeando) os adendos (os símbolos para os inteiros a serem
adicionados). Ou, se pensarmos que os dois números estão contidos em dois
“sacos”, então obteremos a soma simplesmente colocando os dois sacos num
novo saco. O problema desta abordagem não está no procedimento – não
poderia ser mais compacto – mas sim na simbolização (a codificação). Como já
vimos, leva a um crescimento exponencial na utilização de recursos, pelo que é
fisicamente impraticável. Se tentarmos usar uma codificação nominal, os
símbolos serão compactos, mas seremos forçados a construir um procedimento
de tabela de consulta que sucumbirá à explosão combinatória.
0110 carregar
00011 para ser adicionado1 3
01011 para ser adicionado2 11
1110 soma 14
Figura 6.3 Os resultados do cálculo de f+ nas entradas 3 e 11 (representados em binário). Todos os dados criados durante
o cálculo são mostrados em itálico.
4* Observe que o posicionamento espacial relativo permite discernir o número superior como o
primeiro adendo e o número inferior como o segundo adendo. Sendo a adição comutativa, esta
distinção não é relevante; entretanto, para subtração, por exemplo, distinguir entre o minuendo
(o número superior) e o subtraendo (o número inferior) é fundamental.
17
CAP 6 -Procedimentos
O procedimento para f++, que é usado dentro de f+, pode ser implementado
como uma tabela de consulta (Tabela 6.3). Observe que isso não significa que f+
não compacto. A tabela de consulta incorporada não cresce em função da
entrada; f++ só precisa lidar com a adição de três bits. Nossos acréscimos podem
aumentar sem limites, sem alterar a forma como lidamos com cada coluna. Aqui,
a memória de estado não é apenas útil, é necessária. Todos os procedimentos
4* Observe que o posicionamento espacial relativo permite discernir o número superior como o
primeiro adendo e o número inferior como o segundo adendo. Sendo a adição comutativa, esta
distinção não é relevante; entretanto, para subtração, por exemplo, distinguir entre o minuendo
(o número superior) e o subtraendo (o número inferior) é fundamental.
18
CAP 6 -Procedimentos
19
CAP 6 -Procedimentos
20
CAP 6 -Procedimentos
21
CAP 6 -Procedimentos
Um exemplo geométrico
A estreita ligação entre os procedimentos e as codificações que geram os
símbolos sobre os quais operam é um ponto de extrema importância. Ilustramos
isso até agora com operações puramente numéricas nas quais os símbolos se
referiam a números inteiros. Isto pode parecer um referente muito abstrato. Os
cérebros dos animais representam números? Tradicionalmente, a resposta a esta
pergunta tem sido não, mas pesquisas sobre cognição animal nos últimos anos
mostraram que ratos, pombos, macacos e símios representam de fato números
per se (Biro & Matsuzawa, 1999; Boysen & Berntson, 1989 ; Brannon & Terrace,
2002; Cantlon & Brannon, 2005, 2006; Gallistel, 1990; Hauser, Carey, & Hauser,
2000; Matsuzawa & Biro, 2001; Rumbaugh & Washburn, 1993). No entanto, é
desejável uma ilustração não numérica envolvendo símbolos para algo
indiscutivelmente menos abstrato e cuja representação seja claramente uma
base do comportamento animal. Em nosso exemplo final, voltamo-nos para o
processamento de símbolos geométricos, símbolos de localizações. Há
evidências comportamentais esmagadoras de que os animais representam locais,
porque a representação de locais é uma condição sine qua non para uma
navegação eficaz, e animais de todos os tipos, incluindo mais particularmente
insetos, são navegadores talentosos (T. S. Collett, M. Collett, & Wehner, 2001 ;
Gallistel, 1998; Gould, 1986; Menzel et al., 2005; Tautz et al., 2004; J. Wehner &
Srinivasan, 2003; R. Wehner, Lehrer, & Harvey, 1996).
Figura 6.4 Duas maneiras diferentes de codificar locais e linhas em vetores. (a) A codificação cartesiana. (b) Codificação
polar.
22
CAP 6 -Procedimentos
23
CAP 6 -Procedimentos
24