Jpf@fe.up.pt www.fe.up.pt/~jpf Complementos de Engenharia de Software A linguagem VDM++ (4ª parte – Funções avançadas) João Pascoal Faria jpf@fe.up.pt.

Slides:



Advertisements
Apresentações semelhantes
Tratamento de exceções em Java Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de.
Advertisements

CLASSES EM JAVA Dilvan Moreira (baseado no livro Big Java)
Revisão: Potenciação e propriedades.
Linguagem de Programação – Aula 03 Prof. Me. Ronnison Reges Vidal.
Linguagens de Programação Conceitos e Técnicas Definições e declarações Prof. Isabel Cafezeiro
Universidade Federal de Campina Grande – UFCG Centro de Ciências e Tecnologias – CCT Unidade Acadêmica de Engenharia Química - UAEQ Universidade Federal.
Algoritmos e Estruturas de Dados I
Tópicos Preliminares Algorítmos I.
Métodos Formais em Engenharia de Software Especificação Baseada em Modelos em VDM++ (5ª parte) João Pascoal Faria
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2016
Recursividade, Entrada pelo teclado e Funções com retorno
Complementos de Engenharia de Software A linguagem VDM++ (1ª parte - Estrutura geral duma especificação; importação de.
(baseado em slides de ex-alunos)
Complementos de Engenharia de Software A linguagem VDM++ (2ª parte - Operadores e expressões; definição de invariantes,
Métodos Formais em Engenharia de Software 3c
Métodos Formais em Engenharia de Software Especificação Baseada em Modelos em VDM++ (4ª parte) João Pascoal Faria
Estruturas de Repetição
Teste e Qualidade de Software Teste baseado em modelos – exemplo da biblioteca João Pascoal Faria
Linguagem C Para programadores Python
TQS - Teste e Qualidade de Software (Software Testing and Quality) Teste Envolvendo Acesso a Bases de Dados João Pascoal.
TQS - Teste e Qualidade de Software (Software Testing and Quality) Caso de estudo: Problema da procura duma string num.
INF1007: Programação 2 6 – Ordenação de Vetores
Prof. Wellington Franco
Java: Interfaces Alcides Calsavara.
IP – Condicionais e controle de fluxo
Introdução à Programação BCC 201 Aula
TQS - Teste e Qualidade de Software (Software Testing and Quality) Test Driven Devlopment Experiment João Pascoal Faria.
O Problema dos Leitores e Escritores
FUNDAMENTO DE PROGRAMAÇÃO
Introdução à Programação
Métodos Numéricos de Determinação de Raízes: Bisseção, Secante e Newton-Raphson Professor.: Heron Jr.
INE 5201 – INTRODUÇÃO À CIÊNCIA DA COMPUTAÇÃO
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS
Complementos de Engenharia de Software A linguagem VDM++ (3ª parte – instruções; aplicação à descrição de algoritmos e.
Programação Orientada a Objetos
Diagramas de Sequência
Daniel Paulo SQL Server 2016 Módulo II Daniel Paulo
TQS - Teste e Qualidade de Software (Software Testing and Quality) Teste baseado em modelos (visuais e formais): exemplo.
Aula 02 – Produtos Notáveis
TQS - Teste e Qualidade de Software (Software Testing and Quality) Discussão de Exercícios de Teste Baseado em Modelos.
Elaborando as Interfaces Aulas 37, 38 e 39.
Organização básica de arquivos
Revisão: Potenciação e propriedades.
Programação Orientada a Objetos*
BANCO DE DADOS Araújo Lima Set / 2018 Araújo.
Complexidade de Algoritmos
Profa. Maria Augusta Constante Puget
Programação Orientada a Objetos*
Linguagem PASCAL Tipos Estruturados
Algorítmos e Técnicas de Programação
EDA - Prof. Paulemir Campos
Programação Funcional
Mestrado Profissional em Física Médica
Programação Funcional
Filas.
ALGORITMOS.
Arrays de caracteres: strings
Programação em assembly
Python: Comandos Básicos
Disciplina: Banco de Dados II
Vetores.
Programação Orientada a Objetos
Introdução a progrmação Comandos condicionais: if e switch
Aula 11 Professores: Conteúdo: Dante Corbucci Filho
Compiladores – AnáLise léxica
Funções reais de variável real Nesta aula é dada ênfase às funções reais de variável real, isto é, às funções cujo domínio é um subconjunto de R e o conjunto.
RESULUÇÃO DOS EXERCÍCIOS E
Percorrendo coleções com Iterator
Aula 8 Professores: Conteúdo: Dante Corbucci Filho
Aula 10 Professores: Conteúdo: Dante Corbucci Filho
Transcrição da apresentação:

jpf@fe.up.pt www.fe.up.pt/~jpf Complementos de Engenharia de Software A linguagem VDM++ (4ª parte – Funções avançadas) João Pascoal Faria jpf@fe.up.pt www.fe.up.pt/~jpf

Índice Funções polimórficas Funções de ordem superior O tipo função A expressão lambda Exemplo combinado

Funções polimórficas nomeFunção[@TypeParam1, @TypeParam2, …] … São funções genéricas, que podem ser usadas com valores de diferentes tipos Têm parâmetros especiais (type parameters) que devem ser substituídos por nomes de tipos concretos ao usar a função Nomes desses parâmetros começam por “@” e são indicados entre parêntesis rectos a seguir ao nome da função Semelhantes a function templates em C++

Funções polimórficas Exemplo: função utilitária, que verifica se uma sequência de elementos de um tipo qualquer tem duplicados: Exemplo de utilização dessa função: public static HasDuplicates[@T](s: seq of @T) res: bool == exists i, j in set inds s & i <> j and s(i) = s(j); class Publicação instance variables private autores: seq of Autor := []; inv not HasDuplicates[Autor](autores); Passa um tipo concreto

Funções de ordem superior São funções que recebem outras funções como argumentos, ou (Curried functions) que retornam funções como resultado I.e. têm argumentos ou resultado do tipo função Exemplo: função que acha um zero aproximado duma função entre limites especificados, com erro máximo especificado, pelo método das bissecções sucessivas: findZero( f: real -> real , x1, x2, err: real) res: real == if abs(x1 - x2) <= err and abs(f(x1) – f(x2)) <= err then x1 else let m = (x1 + x2) / 2 in if sinal(f(m)) = sinal(f(x1)) then findZero(m,x2) else findZero(x1,m) pre sinal(f(x1)) <> sinal(f(x2));

O tipo função Função total: arg1Type * arg2Type * … +> resultType Função parcial: arg1Type * arg2Type * … -> resultType O tipo de uma função é definido pelos tipos de argumentos e resultado Instâncias de um tipo de função (i.e. funções concretas) podem ser passadas como argumento ou retorno de funções, e guardadas (por referência) em estruturas de dados Pode-se ver como um único argumento do tipo tuplo (instância do produto de tipos)

O tipo função

A expressão lambda lambda padrãoArg1: Tipo1, …, padrãoArgN: TipoN & expr Constrói uma função on the fly Padrões normalmente são simplesmente identificadores de argumentos Usado normalmente para passar como argumento a outra função (de ordem superior) Exemplo: achar um zero real de um polinómio  findZero(lambda x: real & 5 * x**3 - x**2 - 2 , 0, 1, 0.0000001)

Exemplo de funções polimórficas, funções de ordem superior e expressões lambda class Biblioteca instance variables private sócios: set of Sócio; private publicações: set of Publicação; … operations public GetPublicaçõesMaisEmprestadas() res : seq of Publicação == return SeqUtils`SortBy[Publicação](publicações, lambda p: Publicação & len p.GetEmpréstimos(), <Desc>); public GetSóciosComMaisEmpréstimos() res : seq of Sócio == return SeqUtils`SortBy[Sócio](sócios, lambda s: Sócio & card s.GetEmpréstimos(), <Desc>); end Biblioteca

Exemplo de funções polimórficas, funções de ordem superior e expressões lambda class SeqUtils functions -- Ordena uma sequência com base numa função de comparação. -- compare(a,b) deve dar >0 =0 ou <0 conforme a>b, a=b ou a<b. public static Sort[@T](s: seq of @T, compare: @T * @T -> int) res: seq of @T == if s = [] then [] else InsertSorted[@T](hd s, Sort[@T](tl s, compare), compare); -- Função auxiliar que insere um valor numa sequência ordenada. private static InsertSorted[@T](i: @T, s: seq of @T, compare: @T * @T -> int) res : seq of @T == cases true : (s = []) -> [i], (compare(i, hd s) <= 0) -> [i] ^ s, others -> [hd s] ^ InsertSorted[@T](i, tl s, compare) end; ...

Exemplo de funções polimórficas, funções de ordem superior e expressões lambda … types public SortDirection = <Asc> | <Desc>; functions -- Ordena um conjunto por ordem ascendente ou descendente, -- com base no valor de uma função que é aplicada a cada elemento. public static SortBy[@T](s: set of @T, func: @T -> int, dir : SortDirection) res: seq of @T == Sort[@T](SetToSeq[@T](s), lambda e1: @T, e2: @T & if dir = <Asc> then func(e1)-func(e2) else func(e2)-func(e1)); -- Função auxiliar que converte um conjunto para uma sequência arbitrária private static SetToSeq[@T](arg: set of @T) res: seq of @T == if arg = {} then [] else let elem in set arg in [elem] ^ SetToSeq[@T](arg \ {elem}); end SeqUtils