Baixe o app para aproveitar ainda mais
Prévia do material em texto
CURSO: CÓD/ DISCIPLINA: Paradigmas de Linguagens de Programação PROF.º: TURNO: Noite TURMA: SALA: MAT.: NOTA GRADUAÇÃO Nome DATA: 06/06/2022 Trabalho OBS.: Neste trabalho, cada questão objetiva vale 0,5 (meio) ponto, contabilizando o total de 5,0 (cinco) pontos que serão somados à nota da AV2, a qual também valerá 5,0 (cinco). Questão 01. Acerca das linguagens dos paradigmas de programação, indique V (Verdadeiro) ou F (Falso) nas proposições descritas a seguir: 1. ( ) As linguagens funcionais são muito utilizadas em aplicações de Inteligência Artificial, pois buscam simular funções matemáticas o máximo possível. Para isso, uma linguagem puramente funcional não usa variáveis e nem sentenças de atribuição. Além disso, as linguagens funcionais possuem um recurso chamado transparência referencial. Com isso, um programa funcional sempre produz o mesmo resultado quando fornecidos os mesmos parâmetros, não havendo, portanto, efeitos colaterais. 2. ( ) São exemplos de linguagens funcionais: LISP, COMMON LISP, Scheme, Haskell, PROLOG e Perl. 3. ( ) Em algumas situações, a ordem de avaliação dos operandos pode influenciar no resultado de uma expressão aritmética. Em particular, quando uma expressão envolve uma chamada a uma função, essa por sua vez pode alterar os valores de alguns dos demais operandos. Essa situação é denominada de efeito colateral. 4. ( ) Uma exceção é qualquer evento não usual, errôneo ou não, detectável por hardware ou software que possa requerer um processamento especial. Portanto, através do tratamento de exceções, o programador pode especificar o comportamento de um programa quando ocorrem alguns erros específicos. 5. ( ) As Java e C# são exemplos de linguagens que possuem suporte a tratamento de exceções, portanto, não é possível tratar erros de programas escritos em linguagens que não tenham suporte a tratamento de exceções. 6. ( ) Coerção é uma conversão implícita de um tipo de uma variável para outro tipo. 7. ( ) As linguagens do paradigma lógico também são chamadas de linguagens declarativas porque os programas escritos nelas consistem em declarações e são baseadas em lógica simbólica. Ademais, as linguagens lógicas são muito utilizadas em sistemas de gerenciamentos de banco de dados e sistemas especialistas, sendo PROLOG a linguagem lógica mais conhecida. 8. ( ) Além de PROLOG, as linguagens LISP, Perl, Python e COBOL também são consideradas lógicas. 9. ( ) A programação orientada a objeto teve origem na linguagem SIMULA 67, mas só foi completamente desenvolvido com a evolução de Smalltalk, que é considerada a primeira linguagem orientada a objetos. 10. ( ) Uma linguagem orientada a objetos deve fornecer suporte a três recursos principais: tipos de dados abstratos, herança e polimorfismo. Logo, são exemplos de linguagens orientada a objetos: Java, C# e PHP. 11. A linguagem C++ possui suporte a orientação a objetos, porém permite a criação de programas estruturados (como é feito na linguagem C). 12. ( ) Para implementar um tipo abstrato de dados (TAD) em uma linguagem orientada a objetos, deve-se desenvolver uma estrutura composta por atributos e métodos, denominada ‘objeto’. 13. ( ) A herança permite a criação de uma nova classe a partir de uma já existente, portanto, a herança facilita o reuso de código, pois a nova classe herda tanto os atributos quanto os métodos da classe existente. 14. ( ) Em Java, toda classe herda de uma classe base denominada Object (presente no pacote java.lang). A classe Object também é denominada ‘classe primordial’, pois não possui superclasse e é superclasse de todas as demais classes. Assim, em Java podemos criar uma classe A herdando de uma classe B, por meio da seguinte forma: public class A extends B. 15. ( ) Ao criarmos uma classe Funcionario herdando de uma classe Pessoa, dizemos que a primeira classe (Funcionario) é superclasse da segunda (Pessoa). ABCS ABCS Questão 02. Sobre os tipos de parâmetros da linguagem PROLOG, associe os termos da coluna 1 às respectivas definições na coluna 2: (1) Átomo ( ) é um tipo especial de lista que contém apenas números inteiros entre 0 e 255. Ex.: "ABC" ≡ [65, 66, 67]. (2) Termo composto ( ) é uma constante. Representado por uma sequência de letras, números e underscore iniciada por uma letra minúscula ou uma sequência entre plicas, por exemplo: cravo, 'ana.pro', 'Cacilhας, La Batalema'. (3) Número ( ) é uma estrutura complexa. Consiste em um funtor seguido por um ou mais parâmetros entre parêntesis. O funtor deve ser um átomo, os parâmetros podem ser de quaisquer tipos. Ex.: gosta(ana, gato). (4) Lista ( ) é exatamente o que diz. É representado por dígitos numéricos e ponto (para ponto flutuante.) Ex.: 123, 3.1415. (5) String ( ) é uma sequência de elementos de outros tipos. Os delimitadores de início e fim são [ ] e os elementos são separados por vírgulas. O símbolo pipe (|) por ser usado. Ex.: [a, b, c], [abc | SX] Questão 03. Sobre os operadores (conectivos) utilizados na linguagem PROLOG, associe os termos da primeira coluna às respectivas descrições na segunda coluna: (1) “ . ” ( ) é o operador lógico IF e representa a operação lógica implica que (2) “ :- ” ( ) determina o término de toda sentença no Prolog (3) “ , ” ( ) é o operador lógico OR e representa a operação lógica disjunção / ou (4) “ ; ” ( ) é o operador lógico AND e representa a operação lógica conjunção / e (5) not ( ) determina o início de uma consulta (pergunta) no Prolog (6) is ( ) é o operador lógico NOT e representa a operação lógica negação (7) “ = ” ( ) predicado que representa a assimetria induzida é (8) “ \= ” ( ) é o operador relacional IGUAL e representa a operação lógica é igual a (9) < > ( ) é o operador relacional DIFERENTE e representa a operação lógica não igual a (10) =< >= ( ) são os operadores relacionais MENOR QUE e MAIOR QUE (11) “ ?- ” ( ) são os operadores relacionais MENOR OU IGUAL A e MAIOR OU IGUAL A Questão 04. Acerca da linguagem PROLOG, indique V (Verdadeiro) ou F (Falso) nas proposições descritas a seguir: 1. ( ) Prolog é uma linguagem de programação declarativa e funcional de propósito geral, baseada em lógica de primeira ordem, voltada para inteligência artificial e linguística computacional, sendo uma linguagem geralmente interpretada, mas pode ser compilada. 2. ( ) A linguagem Prolog (programmation en logique) foi criada no começo da década de 1970 por um grupo liderado por Alain Colmerauer em Marseille, França. 3. ( ) O uso de Prolog se dá através de consultas (queries), portanto, a programação Prolog consiste em definir um conjunto de verdades chamadas ‘casos’ e relações entre os ‘casos’, chamadas ‘regras’. 4. ( ) Prolog possui quatro tipos de parâmetros: átomo, termo composto, número e lista. Um fato precisa ser um átomo ou um termo composto. 5. ( ) Em Prolog, a cabeça de uma lista pode ser qualquer objeto (inclusive uma lista); a cauda tem que ser uma lista, ou seja, como a cauda é uma lista, ela é vazia ou ela tem sua própria cabeça e sua cauda, por exemplo [ana, tênis, pedro] é representando como o termo: .(ana, .(tênis, .(pedro, [ ]) ) ). Em suma, a cabeça e a cauda são então combinadas em uma estrutura pelo functor especial .(Cabeça, Cauda). 6. ( ) O equivalente a variável em Prolog é a incógnita, que consiste em um valor desconhecido, porém constante, representado por uma sequência similar ao átomo, mas iniciada por uma letra maiúscula. 7. ( ) No Prolog as cláusulas são de três tipos: fatos, regras e perguntas (consultas). Um fato define uma afirmação, uma verdade, enquanto uma regra é um predicado condicional. Portanto, através de perguntas o usuário pode questionar o programa sobre quais coisas são verdadeiras. 8. ( ) De um modo geral, fatos e regras são chamados ‘predicados’ e o conjunto de predicados do programa é chamado ‘domínio do problema’. 9. ( ) Em uma linhade código do Prolog, a regra ‘Se Ana gosta de X implica que X é um flor’ é escrita da seguinte forma: gosta(ana, X) :- flor(X). 10. ( ) Para avaliar expressões aritméticas o Prolog disponibiliza o predicado is que avalia o segundo argumento e unifica o resultado com o primeiro, como no exemplos ?- X is 3+2. que termos como resposta X = 5. Portanto, o segundo argumento deve ser sempre uma expressão completamente instanciada. Questão 05. Qual a saída produzida pelo extrato de código em Python3 descrito a seguir: x = 1 while (x <= 3): print(x) x = x + 1 a) 2 3 b) 1 2 c) 1 2 3 d) Não compila porque tem erro. Questão 06. Analise o código Python3 a seguir: n = 6 r = 0 c = 1 s = -1 while (c <= n): if (c%2 == 0): r = r + c * s else: r = r + c c = c + 1 print("O valores finais de 'r' e 'c' são, respectivamente: ", r, c) Ao compilar e executar o código em Python3, os valores finais nas variáveis r e c serão respectivamente: a) -3 e 7 b) 7 e 5 c) 3 e 6 d) 4 e 6 e) -2 e 7 Questão 07. Com base nos conhecimentos sobre as linguagens de programação funcionais, considere as afirmativas a seguir: I. Uma linguagem de programação funcional tem o objetivo de imitar as funções matemáticas, ou seja, os programas são definições de funções e de especificações da aplicação dessas funções. II. Nas linguagens funcionais, os dados e as rotinas para manipulá-los são mantidos em uma mesma unidade, chamada objeto. Os dados só podem ser manipulados por meio das rotinas que estão na mesma unidade. III. As rotinas de um programa do paradigma funcional descrevem ações que mudam o estado das variáveis do programa, seguindo uma sequência de comandos para o computador executar. IV. A linguagem Lisp é um exemplo do paradigma funcional de programação. Assinale a alternativa CORRETA: a) Somente as afirmativas I e IV são corretas. b) Somente as afirmativas II e III são corretas. c) Somente as afirmativas III e IV são corretas. d) Somente as afirmativas I, II e III são corretas. e) Somente as afirmativas I, II e IV são corretas. Questão 08. Conforme Ghezzi e Jazayeri (GHEZZI; JAZAYERI, 1998, p. 93-96), linguagens como APL, SNOBOL4 e LISP adotam recursos para variáveis com escopo dinâmico, ou seja, uma propriedade dinâmica, em geral, implica amarração em tempo de execução, inviabilizando-a em tempo de compilação. Essa implicação é válida também no caso de variáveis com escopo dinâmico. Com base nessa descrição, considere o trecho de programa a seguir, exemplificado em Ghezzi e Jazayeri (GHEZZI; JAZAYERI, 1998, p. 95), com sintaxe da linguagem C e semântica da linguagem APL: sub2( ) { declare x; ... ... x ...; ... y ,.,.; ... } sub1( ) { declare y; ... ... x ...; ... z ...; sub2(); ... } main( ) { declare x, y, z; z = 0; x = 5; y = 7; sub1; sub2; ... } A respeito da proposta de modificação da linguagem, analise as seguintes afirmações: I. Nesse exemplo, y é variável local à rotina sub1, x é variável local à rotina sub2, e x, y e z são variáveis locais à rotina principal, a main. Nesse contexto, qualquer acesso a uma variável em determinado ponto do programa, que não esteja declarada de forma local na rotina onde esse ponto está inserido, esse acesso é implicitamente assumido como referente a uma variável não local. II. No caso do escopo dinâmico, sabe-se que esse escopo depende da ordem de execução das unidades de programação e não da estrutura estática do programa. III. No exemplo apresentado, quando sub1 é ativada a partir da main, as referências a x e a z são não locais, ou seja, são globais atendendo à declaração dessas variáveis na main. Quando sub2 é ativada a partir de sub1, a referência não local a y, em sub2, é amarrada à sua mais recente declaração, ou seja, ao objeto de dados associado a y local em sub1. Quando sub2 é ativada a partir da main, o acesso a y, em sub2, fará referência, agora, ao objeto de dado associado a y local na main. Em relação aos itens descritos, é CORRETO apenas o que afirmam: a) I. b) II. c) I e III. d) II e III. e) I, II e III. Questão 09. Para as linguagens com escopo dinâmico, a vinculação das variáveis ao escopo é realizada em tempo de execução. (...) Se uma variável é local ao bloco, então o uso da dada variável no bloco será sempre vinculado àquela local. Contudo, se a variável for não local, a sua vinculação depende da ordem de execução, a última vinculada na execução. A consequência disso é que, em um mesmo bloco de comandos, um identificador pode ter significados diferentes, e o programador deve ter a ideia precisa de qual variável está sendo usada. MELO, A. C. V.; SILVA, F. S. C. Princípios de Linguagens de Programação. São Paulo: Edgard Blücher, 2003. p. 65. Considerando a citação acima, suponha que uma linguagem de programação tenha sido projetada com vinculação e verificação estáticas para tipos de variáveis, além de passagem de parâmetros por valor. Também é exigido pela especificação da linguagem que programas sejam compilados integralmente e que não é permitido compilar bibliotecas separadamente. Durante uma revisão da especificação da linguagem, alguém propôs que seja adicionado um mecanismo para suporte a variáveis com escopo dinâmico. A respeito da proposta de modificação da linguagem, analise as seguintes afirmações: I. As variáveis com escopo dinâmico podem ser tratadas como se fossem parâmetros para os subprogramas que as utilizam, sem que o programador tenha que especificá-las ou declarar seu tipo, pois, nesse contexto, o compilador fará a verificação correta de tipo e, assim, eliminando o uso de polimorfismo, pois ao adotar variáveis com escopo dinâmico, o escopo de uma variável fica independente das ativações ou não das rotinas em questão. II. O acesso correto a variáveis com o mesmo nome, mas declaradas em rotinas diferentes, é viabilizado através do recurso de escopo dinâmico, pois permitirá referências a declarações dessas variáveis nas respectivas rotinas. III. No contexto descrito há restrição ao aspecto dinâmico do escopo. Com base nisso, podemos afirmar que a verificação de erros de tipo poderá ser realizada em tempo de compilação se uma variável, além da declaração existente no escopo em que é criada, possuir declaração também na rotina em que é acessada. Dessa forma, a estrutura estática do programa permitiria ao compilador associar corretamente a variável, no seu acesso, às propriedades do correto objeto de dado em uso. Em relação aos itens descritos, é CORRETO apenas o que afirma os itens: a) I. b) II. c) I e III. d) II e III. e) I, II e III. Obs.: Para resolver a próxima questão, leia antes o conteúdo do link http://wiki.icmc.usp.br/images/b/b0/Aula5-230t.pdf , o qual trata sobre como são construídas listas em PROLOG. Se necessário, também use o SWI-PROLOG em http://www.swi-prolog.org/ ou https://swish.swi-prolog.org/ para validar sua avaliação. Questão 10. Na lista [ana, tênis, pedro] temos que o temo ana é a cabeça da lista e [tênis, pedro] é a cauda da lista, ou seja, podemos afirmar que [ana, tênis, pedro] = [ana | [tênis, pedro]]. Com base nesse pressuposto, avalie as estruturas de construção de listas em PROLOG e marque nos subtópicos abaixo o(s) item(s) que contém as saídas (respostas) CORRETA(S) de cada equivalência: 10.1. A equivalência das listas [a, b, c, d] = [a, [b, c, d]]. é: a) true b) false c) erro d) inexistente http://wiki.icmc.usp.br/images/b/b0/Aula5-230t.pdf http://www.swi-prolog.org/ https://swish.swi-prolog.org/ 10.2. A equivalência das listas [a, b, c, d] = [a | [b, c, d]]. é: a) true b) false c) erro d) inexistente 10.3. A equivalência das listas [a, b, c, d] = [a, b, [c, d]]. é: a) trueb) false c) erro d) inexistente 10.4. A equivalência das listas [a, b, c, d] = [a, b | [c, d]]. é: a) true b) false c) erro d) inexistente 10.5. A equivalência das listas [a, b, c, d] = [a, b, c, d, [ ]]. é: a) true b) false c) erro d) inexistente 10.6. A equivalência das listas [a, b, c, d] = [a, b, c, d | [ ]]. é: a) true b) false c) erro d) inexistente 10.7. A equivalência das listas [ ] = [_]. é: a) true b) false c) erro d) inexistente 10.8. A equivalência das listas [ ] = [_|[ ]]. é: a) true b) false c) erro d) inexistente 10.9. A equivalência das listas [_|_] = [a]. é: a) true b) false c) erro d) inexistente 10.10. A equivalência das listas [_|_] = [ ]. é: a) true b) false c) erro d) inexistente
Compartilhar