280 likes | 385 Views
O Cálculo como Linguagem de Programação. Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco - Recife - Brasil. O -Cálculo: Sintaxe. < expr :: variável | expr expr aplicação
E N D
O Cálculo como Linguagem de Programação Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco - Recife - Brasil
O -Cálculo: Sintaxe <expr ::variável | exprexpr aplicação | variável.expr abstração| constante abc = (ab)caplicação é associativa à esquerda
O -Cálculo: Semântica Operacional • Conversão-a: • Conversão-: Substituição de parâmetros reais por parâmetros formais (x.t ) s [ s / x ] t • A Conversão-: Extensionalidade do sistema (x.x )
O -CálculoTeoremas de Church-Rosser 1.Formas normais são únicas. (módulo conversão-) 2. -reduzir a expressão mais externa e mais à esquerda a cada ponto numa sequência de reduções leva a forma normal, se ela existir.
Operações Booleanas • Valores Lógicos true = false = ((true)P)Q P ((false)P)Q Q
Comando If-Then-Else if C then P else Q C P Q Assim: if true then P else QP if false then P else Q Q
Operadores Booleanos Not = b. if b then false else true Or = b. c.if b then true else c And = b. c.if b then c else false
Lemas • not true = false • not false = true • or true true = false • or true false = true • or false false = false • and true true = true • and true false = false • and false true = false • and false false = false
Numerais de Church • Representação dos Números Naturais em Lambda Calculus • Definições: • 0 = f. x.x • succ = n. f. x.f ( n f x ) • repita n vezes f em x = n f x
Sucessor de um Número succ 0 = n. f. x.f( n f x ) 0 f. x.f( 0 f x ) = f. x.f(( f. x.x) f x ) f. x.f(( x.x) x ) f. x.fx Assim, se ( f. x.fx)recebe o valor de 1: 3 = succ(succ(succ(0)))
Numerais de Church 0 = f. x.x 1 = f. x.fx 2 = f. x.f x ... n = f. x.f x n+1 = f. x.f x 2 n+1
Numerais de Church: Adição A adição entre dois Numerais de Church m e npode ser feita computando-se o sucessor de n m vezes, o combinador da adição seria representado por: add = m. n. repita m vezes succ sobre n
Adição addab = ( m. n.m succ n) ab a succ b succ b = succ(succ(...(succ b)...)) ... succ(succ(...(succ b+1)...)) succ(b + a - 1) b + a a a vezes (a - 1) vezes
Numerais de Church: Multiplicação A multiplicação entre dois números m e n pode ser definida como sendo a adição de n a 0, um número m de vezes. mult = m. n. repita m vezes add n sobre0
Multiplicação mult ab = ( m. n.m(add n) 0 ) ab a (add b) 0 = (addb) 0 = addb(addb(...(addb0)...) ... addb(addb(...(addb + b)...) addb(b + b + b ... + b + b) b + b + b ... + b + b = a * b a a vezes (a - 1) vezes (a - 1) vezes a vezes
Numerais de Church: Exponenciação n A exponenciação de m pode ser definida como a multiplicação de m a 1, um número n de vezes. exp = m. n. repita n vezes mult m sobre 1
Exponenciação exp ab = ( m. n.n(mult m) 1) ab b (multa) 1 (multa) 1 = mult a(mult a(...(mult a1)..) ... mult a(a * a * ... * a * a) b b vezes (b - 1) vezes a
Pares Ordenados Um Par Ordenado é uma estrutura algébrica para a manipulação de elementos aos pares. De modo que uma operação realizada sobre um dado elemento não afete o comportamento do outro. <a,b> ->lx.x a b
Pares Ordenados Para obtermos cada elemento de um par ordenado, devemos definir os combinadores fste snd: fst = p.ptrue snd = p.p false Representação: <fst, snd>
Pares Ordenados • Função Predecessor predecessor x = x - 1, se x > 0 0 , se x <= 0 CombinadorPRED : pred = n.snd (repitanvezesFsobre<0 . 0> Onde: F = p. <(fst p) + 1, fstp>
Numerais de Church: Subtração Especificada como: minus a b= a - b, se a >= b = 0, se a < b Combinador: minus = m. n.(repitam vezes predsobre n)
Fatorial O combinador que computa o fatorial de um numeral de Church pode ser definido como: fat = n.fst ( repitan vezes F sobre <1,1>) Onde F é: F = p.<(fst p)*(snd p),(snd p) + 1>
Operadores Relacionais Primeiramente, definamos um operador chamado IsZero especificado como: IsZeron= true, se n = 0 false, se n > 0 Correspondente a : IsZero= n.n(K false)(true)
Operadores Relacionais Analogamente, temos : NoZeron= true, se n > 0 false, se n = 0 Definido como : NoZero = n.n(K true)(false)
Operadores Relacionais Maior Que gt = n. m.(NoZero (minus n m)) Maior ou Igual A ge = n. m.(IsZero(minus m n))
Operadores Relacionais Menor Que lt = n. m.(NoZero(minus m n)) Menor ou Igual A le = n. m.(IsZero(minus n m))
Operadores Relacionais Igual A Um número n é igual a outro número m quando m - n e n - m são iguais a zero: eq= n. m.(and(IsZero(minus n m)) (IsZero(minus m n)))
Amanhã: • Recursividade no l-Cálculo. • Introdução a Lógica Combinatorial. • Máquina de Turner.