Segunda Prova de LP2 - 98/1 ============================ 1 - (1.0) Avalie a expressao abaixo usando lazy evaluation (outermost) O resultado seria o mesmo se ela fosse avaliada de forma estrita (innermost)? Por que? take 2 (map (10 `div`) [-2..]) - Dado o tipo de dados de produtos de um supermercado abaixo, podemos ter produtos simples, com seu codigo e preco, produtos multiplos (caixa de refrigerantes, por exemplo) com seu codigo e sao compostos de um mesmo produto em uma determinada quantidade, e produtos compostos (cesta de natal) que possuem seu codigo mas sao na realidade uma lista de produtos. Uma lista de compras e' a lista dos codigos de cada produto comprado. type Code = Int type Quantity = Int type Price = Int type Name = String type ProductList = [Product] type ShoppingList = [Code] data Product = Simple Code Name Price | Multiple Code Name Product Quantity | Composite Code Name [Product] Faca funcoes para: 2 - (1.5) - criar uma nota da lista de compras, com o nome generico do produto e seu preco: makeBill :: ProductList -> ShoppingList -> [(Name,Price)] 3 - (1.5) - calcule o preco de um produto prodPrice :: Product -> Int 4 - (1.5) - calcule o preco total de uma compra makeTotal :: ProductList -> ShoppingList -> Int 5 - (1.5) - Faca tres funcoes que insiram um novo produto em uma productList. Note que sao dados como entrada os *codigos* dos produtos que compoe produtos multiplos/compostos! insSimple :: ProductList -> Code -> Name -> Price -> ProductList insMultple :: ProductList -> Code -> Name -> Code -> Quantity -> ProductList insComposite :: ProductList -> Code -> Name -> [Code] -> ProductList 6 - (1.5) - faca uma funcao que dobre o preco de um produto. doublePrice :: Product -> Product 7 - (1.0) - Qual o principio de inducao que deveria ser usado se se quisesse provar propriedades sobre o tipo Product? (i.e. qual/quais o(s) caso(s) a serem analisados (mostrar inicio da prova) e a(s) hipotese(s) assumida(s) para tentar provar, por exemplo, que 2 * prodPrice p == prodPrice (doublePrice p) 8 - (1.0) - dada uma lista de compras criar uma lista de produtos comprados *detalhada*, i.e. apenas com produtos simples (em suas quantidades (repeticoes) corretas): makeDetailedList :: ProductList -> ShoppingList -> ProductList