Linguagem de Programacao 2/1A Prova Final -- 02/12/96 1) 2.0 Prove por inducao a seguinte propriedade: map (+3) l = map (+1) (map (+2) l) 3) 3.0 Dado o tipo expressao booleana abaixo, defina uma funcao subexpressao para retornar uma subexpressao, definida por um caminho que define se se deseja a primeira ou segunda subexpressao dos construtores que possuem duas subexpressoes. Exemplo: data BExp = T | F | And BExp BExp | Or BExp BExp | Not BExp | Var Char deriving (Eq,Show) data Qual = Primeira | Segunda deriving (Eq,Show) subexpressao :: [Qual] -> BExp -> BExp expressao1 = And (Var 'y') (And (Var 'z') (Or (Var 'x') (Var 'z'))) subexpressao [Segunda,Segunda,Primeira] expressao1 = (Var 'x') subexpressao [Segunda,Segunda] expressao1 = (Or (Var 'x') (Var 'z')) 3) 3.0 Faca uma funcao que retorne todas as sublistas de uma lista. Exemplo: subl [1,2] = [[1],[2],[1,2]] subl [1,2,3] = [[1],[1,2],[1,2,3],[2],[2,3],[3]] Note que [1,3] nao faz parte do resultado acima. Sua solucao nao precisa estar na ordem dada acima, mas precisa estar completa. 4) 2.0 Faca uma funcao que, dadas duas listas, retorne a lista em que cada elemento de uma lista e' somado ao elemento correspondente na outra, se ambos forem positivos (i.e. maiores que zero). caso contrario retorne o maior entre os dois numeros. Assuma que as listas tem o mesmo tamanho. Exemplo: sum2l :: [Int] -> [Int] -> [Int] sum2l [1,2,3,4] [1,2,-3,3] = [2,4,3,7] sum2l [-4,5,5,4] [-1,2,-3,3] = [-1,7,5,7]