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.