Funções Tipo de relação onde não pode ocorrer a situação um para vários (1-to-N). Daí, a denominação determinística. Notação: Usa-se f x = y em lugar de x R y Em Z, funções são baseadas em Teoria de Conjuntos com Tipos. Apesar disso, cada classe de função tem sua representação própria
Funções Parciais Alicerce para definir as demais classes de funções. Portanto, as funções parciais são as mais simples. X Y = {R:X Y | x:X; y,z:Y x R y x R z y=z} ^ Exemplos: Seja ASCII={A,B,...,Z,a,b,...,z} asc: N ASCII asc={65 A, 66 B,..., 90 Z, 97 a, 98 b, 122 z} Simetrico: Z N p: Z; n: N Simetrico p = n p = n min, max: P N N min = {S: P N; m: N | S m S ( i:S m i) S m} max = {S: P N; m: N | S m S ( i:S m i) S m} I I I III I III II
Funções Totais A função deve ser bem definida em todo o seu domínio. X Y = { f: X Y | dom f = X } ^ Exemplos: Seja BYTE={65,...,122} suc: N N x: N suc x = x + 1 asc: BYTE ASCII asc={65 A, 66 B,..., 90 Z, 97 a, 98 b, 122 z} II I
Operações sobre Funções Os operadores de relações e conjuntos podem ser usados em funções, mas isso não implica fechamento. Exemplo: {João Maria, José Neide} {José Magda} João Maria, José Neide, José Magda} A união de duas funções é fechada se: f, g: X Y f g X Y x: X | x (dom f) (dom g) f x = g x
Operações sobre Funções (cont.) Pode-se evitar a restrição anterior assumindo a sobreposição dos pares de f pelos de g quando x (dom f) (dom g) Notação: f g Exemplo: {João Maria, José Neide} {José Magda} João Maria, José Magda} Obs.: A sobreposição pode ser usada, por exemplo, para realizar atualizações em bancos de dados.
Definição Formal de Sobreposição [X, Y] __ __ : (X Y) (X Y) (X Y) f, g: X Y f g = ((dom g) f) g Cálculo do exemplo anterior segundo a definição: f g= ((dom g) {João | Maria, José | Neide}) {José | Magda} = ({José} {João | Maria, José | Neide}) {José | Magda} = {João | Maria} {José | Magda} Teoremas: 1.f f = f 2.f (g h) = (f g) h 3.{} f = f 4.f {} = f 5.(dom f dom g) = {} f g = f g = g f
Abstrações Lambda Usada para definir uma função sem nome. Notação: | Exemplos: n: N n+n = {n: N n (n+n)} n: N | n 0 n-1 = {n: N | n 0 n (n-1)} Aplicação:Quadrado 2 ( n: N n n) 2 2 2 4 I I I I Quadrado: N N Quadrado = n: N n n I I I I
Algumas Funções Especiais Funções Parciais Injetivas de X para Y: X Y = { f: X Y | x 1, x 2 : dom f f x 1 = f x 2 x 1 = x 2 } > ^ Funções Totais Injetivas de X para Y: X Y = (X Y) (X Y) >> ^ Funções Parciais Sobrejetivas de X para Y: X Y = { f: X Y | ran f = Y} ^ Funções Totais Sobrejetivas de X para Y: X Y = (X Y) (X Y) ^ Funções Parciais Bijetivas de X para Y: X Y = (X Y) (X Y) ^ >> Funções Totais Bijetivas de X para Y: X Y = (X Y) (X Y) ^ >>
Conjuntos Finitos Intervalos Naturais __.. __ : N N P N m, n: N m.. n = { i: N | m i n } Conjunto dos Subconjuntos Finitos de X F X = { S: P X | ( n: N; f:1.. n S true)} (Enumeração) ^ > I IIII I III
Conjuntos Finitos (cont.) Cardinalidade [X] # __ : F X N S: F X n: N; f:1.. n S # S = n > Funções Finitas Parciais Parciais Injetivas X Y = { f: X Y | dom f F X } ^ X Y = X Y X Y > > ^ II II I
Exemplo de Especificação Usando Função entrar, sair, saldo Obs.: Este exemplo pode ser encontrado no livro Specification Case Studies, 2nd Edition, sob o nome de Flexitime, págs
O Estado do Sistema Flexi Standard_Hours, Flexitime_Hours: Time Period worked: Ident Period in: Ident Time dom(in) dom(worked) Time = = N Period = = P Time [Ident] I I
Operações sobre o Estado Response ::= In | Out | Balance | IdUnknown Clocking Flexi ident?: Ident t?: Time ind!: Response ident? dom(worked) Standard_Hours’ = Standard_Hours Flexitime_Hours’ = Flexitime_Hours
Operações sobre o Estado (cont.) ClockIn Clocking ident? dom(in) t? Flexitime_Hours(t?) in’ = in {ident? t?} worked’ = worked Ind! = In ClockOut Clocking ident? dom(in) worked’ = worked {ident? (worked(ident?) (in(ident?).. (t?-1)))} in’ = {ident?} in Ind! = Out 0 0
Operações sobre o Estado (cont.) RelMinutes = = Z Worked Clocking cr!: RelMinutes cr! = # (worked’(ident?) Flexitime_Hours(t?)) - # { t:Standard_Hours(t?) | t < t? } ClockIn = ClockIn Worked ClockOut = ClockOut Worked 0 0
Operações sobre o Estado (cont.) ReadOut Worked ident? dom(in) t? Flexitime_Hours(t?) ind! = Balance Flexi’ = Flexi Unknown Flexi ident?: Ident ind!: Response ident? dom(worked) ind! = Unknown InsertKey = ClockIn ClockOut ReadOut Unknown
Operações sobre o Estado (Final) Add_Employee Flexi ident!: Ident ident! dom(worked) worked’ = worked { ident! | {} } in’ =in Standard_Hours’ = Standard_Hours Flexitime_Hours’ = Flexitime_Hours