Redução de grafos - dcc.fc.up.ptpbv/aulas/linguagens/slides-6.pdf · Em vez dum conjunto...

Click here to load reader

  • date post

    08-Nov-2018
  • Category

    Documents

  • view

    212
  • download

    0

Embed Size (px)

Transcript of Redução de grafos - dcc.fc.up.ptpbv/aulas/linguagens/slides-6.pdf · Em vez dum conjunto...

  • Reduo de grafos

    Pedro Vasconcelos

    4 de Maro de 2014

  • Semntica estrita vs. no-estrita

    Como implementar ((x .M) N)?

    Semntica estritaCall-by-value avaliar N uma vez (mesmo quando no usado)

    Semntica no-estritaCall-by-name avaliar N zero ou mltiplas vezes (sempre que

    for usado)Call-by-need, lazy evaluation avaliar N zero ou uma vez

    (apenas se for usado)

  • Semntica estrita vs. no-estrita

    Semntica estritaUsual em todas as linguagens imperativasTambm em Scheme, Standard ML, Caml e F#Avaliao no-estrita usada nalguns casos:

    operadores lgicos &&, ||parametros declarados call-by-nameestruturas de dados especiais (e.g. streams)macros

    Semntica no-estritaCall-by-name ineficiente para uso geralCall-by-need/lazy evaluation em linguagens funcionaispuras (Miranda, Clean, Haskell)

  • Dificuldades de implementao

    Call-by-name ineficiente: leva duplicao decomputaesCall-by-need/lazy evaluation:

    necessitamos de representar computaes suspensas(thunks)actualizar um thunk com o resultado aps a avaliao(update-in-place)ter o cuidado de partilhar thunks

  • Exemplo

    sqr = x .mult x xmain = sqr (sqr 5)

    Vamos calcular a expresso main.

  • Reduo call-by-nameUsando ordem normal

    sqr (sqr 5) mult (sqr 5) (sqr 5) duplicao

    mult (sqr 5) (sqr 5) mult (mult 5 5) (sqr 5) mult 25 (sqr 5) mult 25 (mult 5 5) mult 25 25 625

  • Reduo de grafos

    Representamos o termo como um grafo em que asaplicaes so ns binrios.

    @~~ !!

    fun arg

    Procuramos o redex mais exterior e mais esquerda(ordem normal)Aps reduzir um sub-termo actualizamos o grafo com oresultado

  • Exemplo

    @

    ||

    sqr @

    sqr 5

    = @}}

    @{{

    ((mult @~~

    sqr 5

    =

    = @{{

    @yy

    ((mult @

    @||

    mult 5

    = @

    @||

    ''mult 25

    =

    = 625

  • Observaes

    A partilha de sub-grafos evita a duplicao de redexesO grafo pode ser implementado em memria como umaestrutura ligadaCada passo de re-escrita apenas modifica apontadores daestruturaProblema: necessitamos de copiar o corpo da abstrao-ao efectuar uma reduo-

  • Exemplo

    ?!!

    @}}

    ))x

    @{{ $$

    @~~

    NOT TRUE

    @{{ !!

    x

    AND x

    =

    ?!!

    x

    @}}

    @{{ !!

    x

    AND x abstrao- original

    @{{

    @xx ##

    AND @{{ $$

    NOT TRUE cpia

  • Evitar duplicaes

    Podemos evitar a necessadade de cpia se efecutarmosreduo de combinadores em vez de -termos.

  • Combinadores

    Termos da lgica combinatria so constituidos por:1 variveis x , y , z . . .;2 constantes S, K, I;3 aplicaes (M N) onde M e N so termos.

    Exemplos:

    ((S x) I) ((S K)K) ((S (K S))K)

    Como no clculo-, omitimos parntesis convencionando que aaplicao associa esquerda, e.g.

    S K K ((S K)K)

  • Combinadores (cont.)

    Regras de reduow (weak):

    I P w PK P Q w P

    S P Q R w P R (Q R)

    Exemplo:S K K x w K x (K x)w x

    Um termo que no admite mais redues diz-se em formanormal fraca. Exemplos: x , I, S K, S K K.

  • Traduo do clculo- em combinadores

    Podemos traduzir qualquer -termo em combinadores usandoduas transformaes sintticas:

    ()CL converte um -termo em combinadores;x abstrai uma varivel num termo de combinadores.

    (x)CL x(M N)CL (M)CL(N)CL

    (x .M)CL x .(M)CL

    x . x Ix .P K P , se x 6 fv(P)

    x .P Q S (x .P) (x .Q)

  • Exemplo de traduo

    (xy . y x)CL x . y . (y x)CL x . y . (y x) x .S (y . y) (y . x) x . (S I) (K x) S (x .S I) (x .K x) S (K (S I)) (S (x .K) (x . x)) S (K (S I)) (S (K K) I)

  • Propriedades da traduo

    (M)CL equivalente a M (ver bibliografia Foundations ofFP)A traduo no preserva formas normais (no importantena prtica)Cada pode duplicar o nmero de aplicaesO termo em combinadores pode ser exponencialmentemaior do que o -termo originalA traduo pode ser melhorada para complexidadequadrtica usando mais combinadores (Turner, 1979)Podemos ainda acrescentar constantes e operaesprimitivas e um combinador ponto-fixo para recurso

  • Reduo de combinadores usando grafos

    Unwind: procurar o redex mais exterior e mais esquerdadescendo pela esquerda dos [email protected]

    @

    @

    ?

    @~~

    ?

    M ?

    tal que M no um [email protected]

  • Reduo de combinadores usando grafos (cont.)Se encontrou o redex, efectua uma re-escrita local e repete oprocesso de unwind.

    ?

    @

    I P

    =?

    P

    ?

    @

    @

    Q

    K P

    =?

    P

    ?

    @~~

    @

    R

    @

    Q

    S P

    =

    ?

    @

    @

    ..

    @

    P Q R

  • Reduo de combinadores usando grafos (cont.)

    Se no encontrou um redex a reduo termina: o grafo estem forma normal fraca (weak head normal form).

  • Supercombinadores

    Em vez dum conjunto pr-determinado de combinadorespodemos traduzir um programa em combinadoresespecializados.

    Um supercombinador um termo- sem variveis livres daforma

    x1. x2. . . . xn.M

    tal que M no uma abstrao e todas as abstraes em Mso tambm supercombinadores.

    Note ainda que n 0, i.e. podemos no ter s.

  • Exemplos

    So supercombinadores:

    x . xf .x . f (f x)x . + x 1(+ 2 5)42

    No so supercombinadores:

    x . y y ocorre livrey .+ y x x ocorre livref . f (x . f x 2) a abstrao x no supercombinador

    (f ocorre livre)

  • Lambda-lifting

    A transformao de um -termo noutro em que todas asabstraes so supercombinadores chama-se lambda-lifting.

    Exemplo: transformar o -termo

    (x . (y . + y x) x) 4

    em que nenhuma das abstraes um supercombinador.

  • Lambda-lifting (cont.)

    Comeamos pela abstrao interior, substituimos a varivellivre x por um argumento extra z e uma aplicao:

    (x . (y . + y x) x) 4

    =(x . ((z. y . + y z) $F

    x) x) 4

    =(x . $F x x) $G

    4

    =$G 4

  • Lambda-lifting (cont.)

    Obtemos a definio de dois supercombinadores:

    $F = z. y . + y z$G = x . $F x x

    A expresso original transformada em

    $G 4

  • Lambda-lifting (cont.)

    Podemos interpretar as definies dos supercombinadorescomo regras de re-escrita:

    $F z y w + y z$G x w $F x x

    Efectuando a reduo da expresso:

    $G 4w $F 4 4w + 4 4w 8

  • Algoritmo de lambda-lifting

    Enquanto existem abstraes-:1 escolher uma abstrao- mais interior (i.e. sem

    subtermos abstraes-);2 abstrair todas as suas variveis livres como novos

    parametros;3 acrescentar a definio de um novo supercombinador (e.g.

    $Fn+1 onde n o nmero actual de supercombinadores);4 substituir a ocorrncia da abstrao- pelo

    supercombinador aplicado s variveis livres.

    Mais detalhes: The Implementation of Functional ProgrammingLanguages, Simon L. Peyton Jones, 1987, captulos 13 & 14.

  • Reduo de supercombinadores

    Para fazer reduo de grafos necessitamos de implementar asregras de re-escrita do grafo para cada um dossupercombinadores usados.

    Ao contrrio dos combinadores SKI, o conjunto desupercombinadores no fixoi.e. depende de cadaprograma concreto.

  • Reduo de supercombinadores (cont.)

    Duas alternativas:1 efectuar cpia do corpo do supercombinador

    (abstraes-);2 compilar cdigo para efectuar a re-escrita do grafo na

    definio.

    A segunda alternativa possibilita muitas optimizaes durante acompilao e a permite implementao muito mais eficientes.

    A G-machine uma mquina virtual para compilao desupercombinadores em cdigo intermdio que efectua reduodo grafos.