O documento descreve as características da linguagem de programação funcional Standard ML e sua extensão CPN ML, incluindo tipos de dados, declaração de variáveis e funções, recursividade, casamento de padrões e inscrições para modelagem de redes de Petri coloridas.
1. Standard ML e CPN ML
Modelagem e Validação de Sistemas
Usando Redes de Petri
Professor: Jorge Abrantes
Aluno: Dalton Cézane
2. Programação funcional e SML
• Funções são valores de primeira ordem e
são tratadas como tipos básicos;
• Computação realizada através da
avaliação das expressões, não pela
seqüência de passos fazendo
modificações em referências de memória
(programação imperativa);
• Polimorfismo;
• Recursão ao invés de iterações;
3. Programação funcional e SML
• Tipos determinados em tempo de compilação
(fortemente tipada);
• Possui garbage collection (limpa memória);
• Avaliação dos parâmetros antes da avaliação da
função;
• Meta programming Language;
• Aplicações: verificação e lógica aplicada (prova
de teoremas), análise de programas, e
compiladores avançados.
10. Consistência de tipos
• Sempre um único tipo é associado a toda
expressão;
• Exemplo:
– Aplicando um operador a um tipo errado;
– Aplicando um operador a tipos mistos.
11. Coerção entre tipos
• Entre inteiros e reais (real);
• Entre caracteres e inteiros (ord e chr);
• Entre caracteres e strings (str);
12. Declarações de variáveis
• val <identificador> = <expressão>;
• Variáveis podem ser redeclaradas e não
precisam ser do mesmo tipo;
• Exemplo...
13. Tuplas
• Importante para construção de tipos complexos;
• Construídas através de uma lista não vazia de
expressões de algum tipo, separadas por
vírgula, entre parêntes: (E1, E2, E3, ..., Em);
• O tipo de uma tupla é um produto: tipo[E1] *
tipo[E2] * ... * tipo[En];
• Para obter o i-ésimo componente de uma tupla:
#i(tupla).
14. Listas
• Também importantes, como tuplas, para
tipos complexos;
• Construídas com uma lista de expressões
do mesmo tipo, separadas por vírgulas,
entre colchetes: [E1, E2, ..., En];
• O tipo de uma lista é:
“tipoDasExpressões” list;
• Notações e operadores: [], nil, hd, tl, @, ::
15. String x list x char
• explode(“string”);
• implode([#”char1”, #”char2”,..., #”charn”]);
• concat([“a”, “bcd”, “ef”])
16. Funções
• Linguagem funcional: definição de
funções e aplicação destas a parâmetros;
• Declaração: fun <identificador>(<lista de
parâmetros>) = <expressão>;
• Aplicação de função: <identificador>(lista
de parâmetros>).
18. Funções
• O binding do valor ao qual uma variável
refere pode ser determinado
estaticamente antes do programa ser
executado (lexically scoped).
• Exemplo: fun addx(y) = y + x;
19. Funções recursivas
• Recursão é usado ao invés de iterações;
• Lógica da recursão: caso base + passos
indutivos com “menores” parâmetros;
• Expressões de parâmetros são avaliadas antes
de serem passadas para a função.
• Obs.: A função reverse é polimórfica (mas
apresenta problema com lista de reais).
20. Recursão mútua
• SML suporta funções mutuamente
recursivas;
• Funções mutuamente recursivas são
agrupadas com o “and”.
21. Casamento de padrão
• Casamento de padrão nos parâmetros
das funções;
• A forma de uma função definida por
padrões:
fun
<identificador>(padrão1)=<expressão1>
| <identificador> (padrão2) = <expressão2>
...
|<identificador> (padrãon) = <expressãon>
22. Casamento de padrão
• Elimina grande parte dos “if”s;
• Merge de duas listas ordenadas:
• Pode explicitar o “casamento de padrão”
com o “as”:
23. Casamento de padrão
• O símbolo _ pode ser usado para denotar
uma variável anônima;
• Com o uso deste símbolo, pode-se evitar
a repetição de variáveis:
24. Expressão case
• Generalização da expressão if-then-else;
• Forma: case E of
<padrão1> => <expressão1>
| <padrão2> => <expressão2>
...
| <padrãon> => <expressãon>
25. Expressão case
• Exemplos:
Obs.: O lado direito das expressões devem ser do mesmo
tipo, assim como os valores resultantes da expressão if.
26. CPN ML
• Uma extensão de Standard ML;
• Facilita o uso da linguagem para quem
não tem prática com SML (tipos = cores);
• Permite declaração de variáveis “tipadas”;
• Permite declaração de variáveis por
“referência”, que não é característica
funcional.
27. Declarações – Colour Sets
• Unit colset nome = unit [with new_unit];
– colset U = unit;
– colset E = unit with e;
• Boolean colset nome = bool [with (new_false, new_true)];
– colset B = bool; (Operações: not, andalso, orelse)
– colset B2 = bool with (no, yes);
• Integer colset nome = int [with int-exp1..int-exp2];
– colset I = int;
– colset I2 = int with 0..9;
– Operadores: ~, +, -, *, div, mod, abs, Int.min(i1,i2), Int.max(i1,i2).
28. Declarações – Colour Sets
• String colset nome = string [with string-
exp1..string-exp2 [and int-exp1..int-exp2]];
– colset lowerstring = string with “a” .. “z” and 1..3;
– Operações: s1^s2, String.size s, substring(s, i, len),
explode s, implode l
• Enumerated colset nome = with id0|id1| … | idn;
– colset dwarfs = Dopey | Doc | Sleepy | Bashful
| Happy | Grumpy | Sneezy;
• Index colset nome = index id with int1..int2;
– colset ALUNO = index aluno with 1..11;
29. Compondo Colour Sets
• Product colset nome = product nome1*nome2*...*nomen;
– colset CASAIS = product HOMEM * MULHER;
– Operações: #i (extrai elemento “i” da tupla), _ (omite
elemento - ex. (Bob,_) – Não permitido em CPN).
• Record colset nome = record id1:nome1 *
id2:nome2 * ... * idn:nomen;
– colset ID = record n:NOME, s:SOBRENOME,
i:IDADE;
– Operações: #idi rec (extrai elemento idi do
record rec: ex: #s rec), … (omite elemento
- Não permitido em CPN).
30. Compondo Colour Sets
• Lists colset nome = list nome0 [with int1..int2];
– colset MinhaLista = list INT with 1..3;
• Union colset nome = union id1[:nome1] +
id2[:nome2] + ... + idn[:nomen];
– colset Digito = int with 0..9;
– colset Uniao = union NUM:Digito + NONE;
31. Compondo Colour Sets
• Subset colset nome = subset nom0 by subset-
function; ou colset nome = subset nom0 with subset-list;
– fun even i = ((i mod 2) = 0);
– colset evenInt = subset INT by even;
– colset int2to4 = subset INT with [2,3,4];
• Alias colset nome = nome0;
– colset Naturais = POSINT;
32. Variáveis, constantes e referências
• var id1[, id2, …, idn]: tipo;
– var x: int;
• val id = exp;
– val maxValor = 5;
• globref id = exp;
– globref i = 10;
– Operações:
• !a conteúdo da r.v. a
• a := b atribui o valor b to r.v. a
• ref b reference constructor
• inc a/dec a in-/decrementa o valor int da r.v. a
33. Funções
• fun id pat1 = exp1
id pat2 = exp2
...
id patn = expn;
– fun ehPos(x) = (x>0);
– fun diff(x,y) = (x<>y);
– fun Divide(x,y) = (x div y)
Divide(_,0) = error;
35. Estruturas de controle
• if boolexp then
exp1
else
exp2
• case exp of
pat1 => exp1
pat2 => exp2
…
patn => expn;
36. Multi-sets
• Construtor: `;
• Sintaxe: i`c (i não-negativo, c é cor – tipo);
– “Adição” e “subtração” de multi-sets;
– 3`true++2`false (3 instâncias true + 2 false);
37. Multi-sets - Operações
empty define um multi-set vazio;
== igualdade;
<><> desigualdade;
>> maior que (>>= ou igual a)
<< menor que (<<= ou igual a)
++ adição
-- subtração
** multiplicação escalar
38. Multi-sets - Operações
size ms tamanho
random ms retorna uma cor pseudo-radômica
cf(c, ms) retorna o n° de itens da cor c em ms
filter p ms filtra ms pelo predicado p
ext_col f ms pega i1`c1++…++in`cn e retorna
i1`f(c1)++…++in`f(cn)
ext_ms f ms pega i1`c1++…++in`cn e retorna
i1*f(c1)++…++in*f(cn)
ms_to_col ms retorna um multi-set de tamanho 1 como
um elemento simples em ms (size ms=1,
raises no_singleton exception)
42. Incrições de transições
Par
m>0 @+2
input(m)
output(n,b)
let
val par = (m mod 2)=0
in
(m+1,par)
end;
Numero Resultado
m
n
b
INT BOOL
3
43. Inscrições de arcos
ParNumero Resultado
m b
INT BOOL
3
1`3
1
m é “vinculado a 3
ParNumero Resultadom b
INT
1`3++1`5
1`3++
1`5
2
m é “livre” (3 ou 5)
BOOL
44. Inscrições de arcos
ParNumero Resultadom b@+2
INT
BOOL
1`3++1`5
1`3++
1`5
2
Delay: arco de saída tem delay 2
ParNumero Resultadom@+2 b
INT BOOL
(1`3++
1`5)@+6
1`3@6++
1`5@6
2
Preemptying time stamps (on input
arcs):
“Par” can use tokens from “Numero”
45. • Incrições de arcos não podem:
– conter I/O ou usar comandos;
– atualizar ou usar variáveis de referências;
– usar funções randômicas. (CPNTools não checa isto)
ParNumero Resultadom if par m
then 1`true
else 1`false
INT BOOL
1`3++1`5
1`3++
1`5
2