Teoria da Computação Programas Fabrício Dias [email protected] Agenda Composição de instruções Programa Programa iterativo Programa recursivo Composição de instruções Duas ou mais operações básicas ou testes podem ser classificados como: Composição seqüencial Composição não-determinista Composição concorrente Composição de Instruções Composição seqüencial Composição não-determinista A execução de uma operação ou teste subseqüente somente pode ser realizada após o encerramento da execução da operação ou teste anterior Uma das operações ou testes compostos é escolhido pra ser executada Composição concorrente As operações ou testes compostos podem ser executados em qualquer ordem, inclusive simultaneamente. Ou seja, a ordem de execução é irrelevante. Relembrando... Programa: É um conjunto estruturado de instruções que capacitam uma máquina a aplicar sucessivamente certas operações básicas e testes em dados iniciais fornecidos, até que esses dados se transformem na forma desejada. Observação Observação: Uma operação que não faz coisa alguma, é denominada: operação vazia, denotada pelo símbolo √ Tipos de programa Programa monolítico Programa iterativo Programa recursivo Programa Iterativo São baseados nos seguintes mecanismos de composição de programa: Seqüencial Condicional Enquanto Até Programa Iterativo Programa iterativo seqüencial Composição de dois programas, resultando em um terceiro, cujo efeito é a execução do primeiro e depois do segundo programa componente. Exemplo: P -> V;W Programa Iterativo Seqüencial Definição: Composição seqüencial: se V e W são programas iterativos, então a composição seqüencial é denotada por V;W e resulta em um programa iterativo cujo efeito é a execução de V e depois a execução de W. Programa Iterativo Programa Iterativo Condicional Composição de dois programas, resultando em um terceiro, cujo efeito é a execução de somente um dos dois programas componentes dependendo do resultado do teste. Exemplo: (Se T entãoV senão W) Programa Iterativo Condicional Definição: Composição condicional: se V e W são programas iterativos, e T é um identificador de teste, então a composição condicional é denotada por (se T então V senão W) e resulta em um programa iterativo cujo efeito é a execução de V se T é verdadeiro ou W se T é falso; Programa Iterativo Programa Iterativo Enquanto 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. Exemplo: Enquanto T faça V. Programa Iterativo Enquanto Definição: Composição enquanto: se V é um programa iterativo, e T é um identificador de teste, então a composição enquanto é denotada por enquanto T faça (V) resulta em um programa iterativo que testa T e executa V, repetidamente, enquanto o resultado do teste for o valor verdadeiro. Caso contrário, a iteração termina. Programa Iterativo Programa Iterativo Até Análoga a composição enquanto, diferente apenas porque a execução do programa componente ocorre enquanto o resultado de um teste for falso Exemplo: Até T faça (V) Programa Iterativo Até Definição: Composição até: se V é um programa iterativo, e T é um identificador de teste, então a composição até é denotada por até T faça (V) resulta em um programa iterativo que testa T e executa V, repetidamente, enquanto o resultado do teste for o valor falso. Caso contrário, a iteração termina. Programa Iterativo Exemplo: •Condicional (se T1 então enquanto T2 faça (até T3 faça (V;W)) senão √) •Enquanto •Até •Seqüencial •Vazio Tradução de programa iterativo em monolítico A tradução de Programas Iterativos para Monolíticos é considerada intuitiva. Entretanto, a inversa não é verdadeira, ou seja, fluxogramas nem sempre podem ser traduzidos para programas iterativos equivalentes, para qualquer máquina. Programa Iterativo Exemplo enquanto T faça (V) Transformando para monolítico... V v T Programa Recursivo Recursão é uma forma indutiva de definir programas Capacidade de um programa de referenciar a si próprio como sub-rotina Sub-rotinas permitem a estruturação hierárquica de programas, possibilitando níveis diferenciados de abstração Processo de empilhamento é implícito O conjunto de Identificadores de Sub-rotinas é descrito por R1, R2, R3 …, Rn Programa Recursivo Expressão de sub-rotina Uma expressão de sub-rotina E, é definida indutivamente por: A operação vazia √ constitui uma expressão de subrotinas Cada identificador de operação constitui uma expressão de sub-rotinas Cada identificador de sub-rotina constitui uma expressão de sub-rotinas. Programa Recursivo Expressão de sub-rotina (Continuação) Composição seqüencial: Se D1 e D2 são expressões de sub-rotinas, então a composição seqüencial denotada por: D1 ; D2 resulta em uma expressão de subrotina cujo efeito é a execução de D1 e, após, a execução de D2. Programa Recursivo Expressão de sub-rotinas (continuação) 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 cujo efeito é a execução de D1 se T é verdadeiro ou D2 se T é falso. Programa Recursivo Definição: Um programa recursivo P tem a seguinte forma: P é E0 onde R1 def E1, R2 def E2, ..., Rn def Em Onde: E0 é a Expressão Inicial a qual é uma expressão de sub-rotina; En é a Expressão que define Rn ou seja, a expressão que define a sub-rotina identificada por Rn; A operação vazia constitui um programa recursivo que não faz coisa alguma Programa Recursivo Exemplo: P é R ; S onde R def F; (se T então R senão G;S) S def (se T então √ senão F;R) Dúvidas???