Aula 3 - Programas, Máquinas

Você também pode gostar

Você está na página 1de 38

Teoria da Computação

Aula 3

Sumário
➢ Programas
▪ Tipos de programas (Monolíticos, Iterativos e
Recursivos)
➢ Máquinas
▪ Tipos de máquinas: Máquina de Dois registradores
Programa
➢ Conjunto de instruções que capacitam uma máquina a executar certas
operações e testes sobre dados de entrada, com o objetivo de transformar
esses dados numa forma desejável (produzindo as saídas desejadas).

➢ Deve explicar como as operações ou testes devem ser sequenciados no tempo:


deve possuir uma “estrutura de controle” de operações e testes.
Estrutura de controle

Destacam-se na forma de tipos de programas as seguintes:


Monolítica (Flowchart programs)
➢ É baseada em desvios condicionais e incondicionais, não possuindo mecanismos
explícitos de iteração, subdivisão ou recursão.

Iterativa (while programs)


➢ Possui mecanismos de controle de iterações de trechos de programas. Não
permite desvios incondicionais
Estrutura de controle
Recursiva (Procedure programs)
➢ Possui mecanismos de estruturação em sub-rotinas recursivas.
➢ Recursão é uma forma indutiva de definir programas. Também não permite
desvios incondicionais.
Estrutura de controle
Independentemente da estrutura de controle, duas ou mais operações ou testes
podem possuir a seguinte composição:
➢ Composição sequencial: A execução de uma operação ou teste subsequente só
ocorre após o enceramento da operação ou teste anterior.

➢ Composição não determinística ou determinística (escolha): a próxima operação


ou teste a ser executada é uma escolha entre diversas alternativas de operação ou
testes compostos, em caso da determinística.

➢ Composição concorrente: as operações ou testes compostos podem ser


executados em qualquer ordem, inclusive simultaneamente.
Identifiadores de Operações
➢ F, F1, F2, F,....G,,G1,G2,G3,...H, H1,H2,H3,...

Identifiadores de Testes
➢ T1,T2,T3,...
➢ Um teste só retorna dois valores possíveis: Verdadeiro ou Falso.
Programa Monolítico

➢ É Estruturado usando desvios condicionais e incondicionais.


➢ Não faz o uso explicito de mecanismos auxiliares de programação que permitem
uma melhor estruturação do controle: recursão ou subdivisão, iteracção.
➢ A lógica é distribuída por todo bloco (monólito) que constitui o programa.

➢ Pode ser representado através de um fluxograma ou na forma textual,


usando instruções rotuladas.
Programa Monolítico (Fluxograma)

➢ Uma das formas mais comuns e tradicionais de especificar programas


monolíticos é através de fluxogramas.
➢ Um fluxograma é um diagrama geométrico construído a partir de componentes
(fluxogramas) elementares denominados partida, parada, operação e teste.
Programa Monolítico
Componentes: Fluxograma

Instruções rotuladas
Programa Monolítico (Instrução Rotulada)

➢ Cada instrução rotulada é identificada por um rótulo.


➢ Um rótulo ou Etiqueta é uma cadeia de caracteres finita (palavra) constituída de
letras ou dígitos.

Uma instrução rotulada pode ser:


➢ Operação: indica a operação a ser executada seguida de um desvio incondicional
para a instrução subsequente.
➢ Teste: Determina um desvio condicional, ou seja depende da avaliação de um
teste.
Programa Monolítico (Instrução Rotulada)

➢ Uma instrução rotulada tem a seguinte forma:


➢ 1: faça F vá_para 2 (Operação simples)
➢ 2: se T1 então vá_para 1 senão vá_para 3 (Teste)
➢ 3: faça G vá_para 4 (operação vazia)
➢ Se T2 então vá_para 5 senão vá_para 1(teste)

➢ 1,2 e 3 são rótulos numéricos, F é um identificador de operação e T é um


identificador de Teste.
Programas monolíticos
Um programa monolítico é um para ordenado P(I,R):
➢ I é um conjunto (finito) de instruções rotuladas;
➢ R é o rótulo inicial que identifica a instrução inicial I.

Sendo que:
➢ Duas instruções diferentes não podem ter o mesmo rótulo.
➢ Um rótulo final é aquele referenciado mas não está associados a nenhuma
instrução.
Programas monolíticos

Exemplos
P1 = (I1,1), onde P2 = ({1: faça F vá_para 2,
I1 = { 2:se T vá_para 1 senão vá_para
1: faça F vá_para 2, 3},1)
2: se T1 então vá_para 1 senão
vá_para 3,
3: faça G vá_para 4,
Se T2 então vá_para 5 senão vá_para
1
}

➢ Dada sua composição sequencial, são usadas pela maioria das linguagens de
máquinas, como linguagem de baixo nível (assembly).
Programas interativo

A noção de programa com estruturas iterativas tem sua origem na tentativa de


solucionar os problemas decorrentes da dificuldade de entendimento e manutenção
de programas monolíticos onde existe uma grande liberdade para definir desvios
incondicionais ocasionando o que vulgarmente é conhecido como quebras de lógica.

➢ Substituem desvios incondicionais (nos programas monolíticos) por estruturas


cíclicas, permitindo um melhor controle e manutenção de programas.
➢ Deram origem à programação Estruturada
Programas interativo

Elementos de estruturação:
➢ Execução sequencial: Composição de dois programas, resultando em um terceiro,
cujo efeito é a execução do primeiro e, após, a execução do segundo programa
componente.

➢ Execução condicional (única entrada, única saída): composição de dois programas,


resultando em um terceiro, cujo efeito é a execução de somente um dos dois
programas componentes dependendo do resultado de um teste
Programas interativo

Elementos de estruturação (Cont.):

➢ Execução iterativa (enquanto/até de forma análoga): Composição de um


programa, resultando em um segundo, cujo efeito é a execução, repetidamente,
do programa componente enquanto o resultado de um teste for verdadeiro.
Programa iterativo
Pode ser definido como:
➢ A operação vazia e os identificadores são programas iteractivos

Composição sequencial
➢ Se V e W são programas iteractivos, então a composição seqüencial denotada por
V;W resulta em um programa iterativo, cujo efeito é a execução de V e, após, a
execução de W.
Programa iterativo
Composição condicional
➢ Se V e W são programas iterativos e se T é um identificador de teste, então a
composição condicional, denotada por “se T então V senão W”, resulta em um
programa iterativo cujo efeito é a execução de V se T é verdadeiro ou W se T é
falso.
Programa iterativo

Composição enquanto
➢ Se V é um programa iterativo e se T é um identificador de teste, então
“Enquanto T faça V”, é um programa iterativo (execução do tipo “enquanto”) cujo
efeito é a execução de V enquanto o resultado do teste de T for verdadeiro. Caso
contrário, a iteração termina.
De forma análoga funciona a “ Execução do tipo até”.
Até T faça V.
Programa iterativo
• Em relação á composição sequencial tem-se:
• P1;P2;P3;...Pn

➢ Enquanto T faça V;W


➢ (enquanto T faça V); W
➢ Enquanto T faça (V;W)

O uso de () define a existência de estruturas de blocos


Programa recursivo

Em algumas linguagens de programação tem a definição de sub-rotinas recursivas.


➢ Recursão é uma forma indutiva de definir programas.
➢ Sub-rotinas permitem a estruturação hierárquica de programas, possibilitando
níveis diferenciados de abstração

➢ Consiste em dividir um problema em subproblemas do memo tipo. Os


subproblemas são resolvidos e seus resultados combinados.
Programa recursivo
Programa recursivo

Uma Expressão de Sub-rotinas é indutivamente definida como:


➢ A operação vazia constitui uma expressão de sub-rotinas;
➢ Cada identificador de operação constitui uma expressão de sub-rotinas;
➢ Cada identificador de sub-rotina constitui uma expressão de subrotinas;

Composição sequencial
➢ Se D1 e D2 são expressões de sub-rotinas, então a composição sequencial
denotada por D1; D2 resulta em uma expressão de sub-rotinas cujo efeito é a
execução de D1 e, após, a execução de D2.
Programa recursivo

Composição Condicional
➢ Se D1 e D2 são expressões de sub-rotinas e T é um identificador de teste, então
a composição condicional denotada por se T então D1 senão D2 resulta em
uma expressão de sub-rotinas cujo efeito é a execução de D1 se T é verdadeiro
ou D2 se T é falso.
Programa recursivo

Tem a seguinte forma:


P é 𝐸0 𝒐𝒏𝒅𝒆 𝑅1 𝒅𝒆𝒇 𝐸1 , 𝑅2 𝒅𝒆𝒇 𝐸2 , … , 𝑅𝑛 𝒅𝒆𝒇 𝐸𝑛 𝑜𝑛𝑑𝑒 𝑠𝑢𝑝𝑜𝑛ℎ𝑎 𝑘 𝜖 1,2, … , 𝑛 :

➢ 𝐸0 Expressão inicial a qual é uma expressão de sub-rotinas;


➢ 𝐸𝑘 Expressão que define a sub-rotina identificada por 𝑅𝑘
Programa recursivo

Todos identificadores de sub-rotinas referenciados em P devem ser definidos em P.


Ex

A computação de um programa recursivo será detalhada adiante, quando da introdução


do conceito de computação.
Programa recursivo

TPC
Desenvolver um programa recursivo, sobre uma máquina genérica, que calcule o
fatorial de n utilizando a fórmula f = 1 * 2 * 3 * 4 * ... * n

➢ O valor de n será fornecido pelo usuário, devendo ser um valor inteiro e positivo.
➢ Caso o usuário forneça um valor inválido para n, o programa deverá apresentar
uma mensagem de erro.
Máquinas
Máquina

Tem por objectivo suprir todas as informações necessárias para que a computação de
um programa possa ser descrita (funções de entrada e saída):
➢ Suprir o significado aos identificadores das operações de Testes.
➢ Cada identificador de operação interpretado pela máquina deve ser associado a
uma transformação na estrutura de memória.
➢ Cada identificador de teste interpretado pela máquina deve ser associado a uma
função verdade.
Máquina

Observações
➢ Nem todo o identificador de operação ou teste é definido em uma máquina.
➢ Para cada identificador de operação ou teste definido em uma máquina, existe
somente uma função associada.
➢ A máquina deve descrever o armazenamento ou recuperação de informações na
estrutura de memória.
Máquina
Uma máquina é uma 7-upla:
𝑴 = (𝑽, 𝑿, 𝒀, 𝝅𝒙, 𝝅𝒚, 𝜫𝑭, 𝜫𝑻)

➢ V – Conjunto de valores de memória.


➢ X – Conjunto de valores de entrada.
➢ Y – Conjunto de valores de saída.
➢ 𝝅𝒙 – Função de entrada, tal que 𝝅𝒙: 𝑿 → 𝑽
➢ 𝝅𝒚 – Função de saída, tal que 𝝅𝒚: 𝑽 → 𝒀
➢ 𝜫𝑭 – Conjunto de interpretações de operações, onde para cada identificador de
operação F interpretado por M, existe uma única função: 𝝅𝑭: 𝑽 → 𝑽 𝒆𝒎 𝜫𝑭
➢ 𝜫𝑻 – Conjunto de interpretações de testes, tal que para cada identificador de teste T
interpretado por M, existe uma única função: 𝝅𝑻: 𝑽 → 𝒗𝒆𝒓𝒅𝒂𝒅𝒆𝒊𝒓𝒐, 𝒇𝒂𝒍𝒔𝒐 𝒆𝒎 𝜫𝑻
Máquina de dois Registradores
Suponha uma especificação de uma máquina com duas posições de memória,
denominadas registradores a e b, os quais assumem valores em N, com duas operações e
um teste, como segue:
➢ Subtração de 1 em a, se a ≥ O;
➢ Adição de 1 em b;
➢ Teste se a é zero.

➢ Adicionalmente, valores de entrada são armazenados em a (zerando b) e a saída


retorna o valor de b.
➢ Dois registradores com valores em N podem ser definidos pelo produto cartesiano 𝑵𝟐
onde os registradores a e b são representados pela primeira e segunda componente,
respectivamente.
Máquina de Dois Reistradores

dois_reg =
𝑁 2 , 𝑁, 𝑁, 𝑎𝑟𝑚𝑎𝑧𝑒𝑛𝑎_𝑎, 𝑟𝑒𝑡𝑜𝑟𝑛𝑎_𝑏 𝑠𝑢𝑏𝑡𝑟𝑎𝑖𝑟_𝑎, 𝑎𝑑𝑖𝑐𝑖𝑜𝑛𝑎𝑟_𝑏 , 𝑎_𝑧𝑒𝑟𝑜 , 𝑜𝑛𝑑𝑒:
➢ 𝑁 2 corresponde ao conjunto de valores de memória.
➢ N corresponde, simultaneamente, aos conjuntos de valores de entrada e saída.
➢ Armazena_a: ℵ → ℵ2 é a função de entrada, tal que ∀𝑛 𝜖 ℵ :
--armazena_a(n) = (n,0)
➢ Retorna_b: ℵ → ℵ2 é a função de saída, tal que ∀ (n,m) 𝜖ℵ2 :
--- retorna_b(n,m) = m
➢ Subtrair_a: ℵ2 → ℵ2 é a interpretação, tal que ∀ (n,m) 𝜖 ℵ2 :
--subtrair_a(n,m) = (n-1, m) se n ≠ 0
-- subtrair_a(n,m) = (0,m), se n = 0
Máquina de Dois Reistradores

➢ adicionar_b: ℵ → ℵ2 é a interpretação, tal que ∀ (n,m) 𝜖 ℵ2 :


--adicionar_b(n,m) = (n, m+1)
➢ a_zero: ℵ2 → {verdadeiro, falso} é a interpretação, tal que ∀ (n,m) 𝜖 ℵ2 :
--a_zero(n,m)= verdadeiro, se n = 0
--a_zero(n,m) = falso, se n ≠0
Máquina de Dois Reistradores

Exemplo: implementação de uma contagem até n.


armazena_a(n)
enquanto a não é zero:
adicionar_b()
subtrair_a()
retorna_b()
GARANTE O TEU FUTURO
COM UMA FORMAÇÃO SÓLIDA

Você também pode gostar