• Aucun résultat trouvé

Mon parcours en Hypnose

Partie II : Application clinique de soins dentaires sous hypnose

II.1. Mon parcours en Hypnose

Defini¸c˜oes de fun¸c˜oes em Notus podem ser escritas em m´odulos distintos, e o projetista n˜ao precisa definir sua ordem de gera¸c˜ao. Haskell processa o casamento de padr˜oes em todas as constru¸c˜oes em que ´e usado de cima para baixo e da esquerda para a direita [Jones, 2003]. Assim, Haskell processa as defini¸c˜oes de fun¸c˜oes na ordem em que essas s˜ao definidas no c´odigo-fonte. Dessa forma, o compilador de Notus deve ordenar as defini¸c˜oes de forma que a semˆantica da linguagem definida n˜ao seja prejudicada pela forma como compiladores e interpretadores Haskell as processam.

Seja Defs = {def1, def2, · · · , defn} o conjunto das defini¸c˜oes para uma fun¸c˜ao re-

sultante da etapa de Function definitions arity analyzer, descrita na Se¸c˜ao 5.4. O conjunto de defini¸c˜oes Defs, para cada fun¸c˜ao declarada na especifica¸c˜ao, ´e pro- cessado nessa etapa com o objetivo de se definir a ordem correta no c´odigo Haskell gerado. As seq¨uˆencias de padr˜oes das defini¸c˜oes s˜ao ordenadas duas-a-duas. Sejam ent˜ao defa ∈ Defs = {pa.1, pa.2, · · · , pa.n} e defb ∈ Defs = {pb.1, pb.2, · · · , pb.n} duas

defini¸c˜oes com seus respectivos conjuntos de padr˜oes, onde n ´e a aridade da fun¸c˜ao analisada. Cada par de padr˜ao pa.i, e pb.i, i = 1 · · · n, ´e analisado com o aux´ılio do

grafo de dom´ınios G′

5.6. An´alise dos Padr˜oes das Definic¸˜oes 137 para o autˆomato finito determin´ıstico M , cuja a fun¸c˜ao de transi¸c˜ao ´e ilustrada pelo grafo na Figura 5.29. A an´alise consiste em comparar os dom´ınios D1 e D2, determi-

nando a rela¸c˜ao existente entre eles no grafo G′

d. O resultado da compara¸c˜ao ´e um

s´ımbolo pertencente ao alfabeto do AFD M = (S, Σ, δ, s0, A) onde:

• S ´e o conjunto de estados do autˆomato {s0, s1, s2, s3, s4}, onde:

– s0 indica que as duas defini¸c˜oes s˜ao iguais;

– s1 indica que a defini¸c˜ao defa´e mais espec´ıfica do que a defini¸c˜ao defb;

– s2 indica que a defini¸c˜ao defb ´e mais espec´ıfica do que a defini¸c˜ao defa;

– s3 indica que as defini¸c˜oes defa e defb s˜ao conflitantes, ou seja, existe pelo

menos uma seq¨uˆencia de padr˜oes para a fun¸c˜ao analisada que pode ser casada em ambas as defini¸c˜oes;

– s4 indica que as duas defini¸c˜oes defa e defb s˜ao disjuntas, ou seja, dada uma

seq¨uˆencia de padr˜oes pSeq para a fun¸c˜ao analisada, ou pSeq casa com defa,

ou casa com defb.

• Σ ´e o alfabeto formado por {e, f, s, n, d}, onde:

– e ´e o s´ımbolo que representa que os padr˜oes pa.i e pb.i possuem o mesmo

dom´ınio (equals);

– f ´e o s´ımbolo que representa a existˆencia de uma aresta no grafo de dom´ınios G′

d de D1 para D2 (first);

– s ´e o s´ımbolo que representa a existˆencia de uma aresta no grafo de dom´ınios G′

d de D2 para D1 (second );

– n ´e o s´ımbolo que indica que, para o grafo G′ d, ˆΓ

+

(D1) ∩ ˆΓ+(D2) 6= ∅, ou

seja, os dom´ınios D1 e D2 possuem subtipos em comum (non-empty);

– d ´e o s´ımbolo que indica que os dom´ınios D1 e D2 s˜ao disjuntos, ou seja,

n˜ao existe rela¸c˜ao entre D1 e D2 no grafo G′d (disjoints).

• δ ´e a fun¸c˜ao de transi¸c˜ao definida pela tabela de transi¸c˜ao de estados na Tabela 5.1.

• A ´e o conjunto de estados de aceita¸c˜ao do autˆomato {s0, s1, s2, s3, s4}.

Os estados de aceita¸c˜ao do autˆomato M , obtidos para cada par de defini¸c˜oes, s˜ao usados para a constru¸c˜ao de um novo grafo, que define a ordem de gera¸c˜ao das de- fini¸c˜oes. O grafo constru´ıdo ´e definido por Gdef = (V2, E2) onde cada v´ertice v ∈ V2

e f s d n s0 s0 s1 s2 s4 s3 s1 s1 s1 s3 s4 s3 s2 s2 s3 s2 s4 s3 s3 s3 s3 s3 s4 s3 s4 s4 s4 s4 s4 s4

Tabela 5.1: Tabela de transi¸c˜ao de estados para o autˆomato M .

GFED @ABC?>=<89:;s1 f,e  d %% n,s  // GFED@ABC?>=<89:;s0 e  f 33 d // s ++ n && GFED @ABC?>=<89:;s4 e,f,s,d,n vv error GFED @ABC?>=<89:;s2 s,e  d 99 n,f 

conflict GFED@ABC?>=<89:;s3

n,f,s,e

TT

d

@@

Figura 5.29: Representa¸c˜ao gr´afica da fun¸c˜ao de transi¸c˜ao para o autˆomato M , usado na determina¸c˜ao da ordem de gera¸c˜ao das defini¸c˜oes de uma fun¸c˜ao.

onde u, v ∈ V2 tal que ˆδ(s0, γ(u, v)) = s1, e γ(u, v) ∈ Σ∗ ´e a seq¨uˆencia de resulta-

dos da compara¸c˜ao dos dom´ınios dos padr˜oes de defa e defb, com base no grafo de dom´ınios G′

d. De forma an´aloga, uma aresta (v, u) ∈ E2 ´e inserida no grafo Gdef se

ˆ

δ(s0, γ(u, v)) = s2. Sendo defa representada por u e defb por v, uma aresta (u, v)

indica que defa deve ser gerada antes de defb, e uma aresta (v, u) indica que defb deve

ser gerada antes de defa.

A ocorrˆencia do estado de aceita¸c˜ao s0 gera um erro de execu¸c˜ao, pois indica que

as defini¸c˜oes analisadas s˜ao iguais e, portanto, devem ser refeitas pelo projetista. O estado de aceita¸c˜ao s4 n˜ao gera restri¸c˜ao ao compilador e as defini¸c˜oes analisadas,

caso independentes, podem ser geradas em qualquer ordem. O estado de aceita¸c˜ao s3

indica a ocorrˆencia de um conflito entre defa e defb. O compilador avalia o conflito

determinando, por meio das demais defini¸c˜oes para a fun¸c˜ao analisada, se defa e defb

podem ser consideradas disjuntas, ou se constituem um caso de erro. O conflito ocorre quando existe pelo menos uma seq¨uˆencia de padr˜oes de chamada que pode ser casada tanto com defa quanto com defb. No entanto, essa ambig¨uidade pode ser resolvida

5.6. An´alise dos Padr˜oes das Definic¸˜oes 139 pelas demais defini¸c˜oes existentes, mas se n˜ao o for, o conflito se torna um erro. A an´alise feita para o caso de conflitos entre duas defini¸c˜oes ´e composta pelos seguintes passos:

1. c´alculo da interse¸c˜ao do ˆΓ+

dos dom´ınios de cada par de padr˜ao pa.icom dom´ınio

Da.i, e pb.i com dom´ınio Db.i, gerando uma lista de dom´ınios: < (ˆΓ+(Da.1) ∩

ˆ Γ+

(Db.1)), · · · , (ˆΓ+(Da.n) ∩ ˆΓ+(Db.n)) >;

2. combina¸c˜ao da lista do passo anterior gerando uma lista Lc de possibilidades de

seq¨uˆencia de padr˜oes, que cont´em as seq¨uˆencias de padr˜oes que casam tanto com defa quanto com defb;

3. para cada uma das demais defini¸c˜oes defj = Defs \ {def1, def2} com j = 1 · · · n,

existentes para a fun¸c˜ao analisada, verifica se defj est´a presente na lista Lc.

Caso isso ocorra, a seq¨uˆencia de padr˜oes de defj ´e eliminada da lista Lc. Dessa

maneira, o padr˜ao que casaria tanto com defa quanto com defb ´e tratado por

defj.

4. Ao fim da an´alise de todas a defini¸c˜oes defj, se Lc estiver vazia, ent˜ao defa e

defb s˜ao disjuntas, pois nesse caso todos os padr˜oes conflitantes foram resolvidos.

Caso contr´ario, um erro ´e gerado pelo compilador.

A Figura 5.30 mostra o grafo gerado para as defini¸c˜oes da fun¸c˜ao fun (definida na Listagem 5.2). Note que, os identificadores e0,g1 e g2, que aparecem nas defini¸c˜oes de fun, foram criados pelo compilador pela etapa de explicita¸c˜ao de parˆametros das defini¸c˜oes da fun¸c˜oes (veja Se¸c˜ao 5.4).

f u n c t i o n f u n : A −> E −> G −> H ; f u n a e0 g1 = R1 e0 g1 ; // d e f 1 f u n b e g2 = R2 g2 ; // d e f 2 f u n c i g = R3 ; // d e f 3 f u n c i k = R4 ; // d e f 4 f u n c e k = R5 ; // d e f 5 ONML

HIJKdef1 oo ONMLHIJKdef2

ONML HIJKdef5 ccFFF FFF FFFF ONML HIJKdef4 OO // ;;x x x x x x x x x x ONML HIJKdef3 YY44 44 44 44 44 44 44 444 OO

Figura 5.30: Grafo Gdef de defini¸c˜ao de fun¸c˜ao para as defini¸c˜oes da fun¸c˜ao fun

As defini¸c˜oes def2, def3, def4 e def5 est˜ao contidas em def1, pois o conjunto de

f u n c t i o n f u n : A −> E −> G −> H ; f u n b e g2 = R2 g2 ; // d e f 2 f u n c i k = R4 ; // d e f 4 f u n c i g = R3 ; // d e f 3 f u n c e k = R5 ; // d e f 5 f u n a e0 g1 = R1 e0 g1 ; // d e f 1

Listagem 5.24: Defini¸c˜oes para a fun¸c˜ao funordenadas.

portanto, ˆδ(s0, γ(def1, def2)) = s2, e arestas s˜ao criadas de def2, def3, def4 e def5 para

def1 em Gdef. De forma an´aloga, a defini¸c˜ao def4 ´e mais espec´ıfica que as defini¸c˜oes

def5 e def3, e def3 ´e mais espec´ıfica que def5, criando-se arestas entre essas defini¸c˜oes.

Ap´os a constru¸c˜ao do grafo Gdef, o compilador de Notus executa o algoritmo de or-

dena¸c˜ao topol´ogica [Sedgewick, 1990] em Gdef, obtendo a ordem de gera¸c˜ao de fun¸c˜oes.

Um resultado da ordena¸c˜ao topol´ogica para o grafo da Figura 5.30 ´e:

< def2, def4, def3, def5, def1 >. A Listagem 5.24 mostra as defini¸c˜oes na ordem em

que s˜ao geradas para Haskell.

Documents relatifs