# Reescrita de grafos

Na Teoria dos Grafos, reescrita de grafos denota um sistema de reescrita para grafos, isto é, um conjunto de regras de reescrita de grafos da forma $\rho :L\longrightarrow R$, sendo $\,L$ o grafo usado como padrão (no lado esquerdo) e $\,R$ o grafo de substituição (no lado direito da regra).
Uma regra de reescrita de grafos é aplicada ao grafo hospedeiro procurando por uma ocorrência do grafo padrão $\,L$ (resolvendo assim o problema do isomorfismo de subgrafos) e substituindo a ocorrência encontrada por uma instância do grafo de substituição.
Algumas vez gramática de grafos é usado como um sinônimo para sistema de reescrita de grafos, especialmente no contexto de linguagens formais; a expressão distinta é usada para enfatizar o objetivo de enumerar todos os grafos a partir de um grafo inicial, isto é, descrevendo uma linguagem de grafos (como em uma gramática de atributos), em vez de transformar um estado dado (um grafo hospedeiro) em um novo estado.

## Abordagens à reescrita de grafos
### Abordagem algébrica

Há muitas abordagens à reescrita de grafos, sendo uma delas é a abordagem algébrica, que é baseada na Teoria das Categorias. De fato a abordagem algébrica é dividida em algumas sub-abordagens, sendo a DPO (pushout duplo) e a SPO (pushout único) as mais importantes; há também outras, seguindo-se nesta linha, tais quais a sesqui-pushout e a abordagem pullback.
Pushout é o colimite de um diagrama, consistindo de dois morfismos $f:Z\rightarrow X$ e $g:Z\rightarrow Y$ com um domínio comum. Pullback é o dual do pushout.
Da perspectiva da abordagem DPO uma regra de reescrita de grafos é um par de morfismos na categoria dos grafos, com morfismos totais entre os grafos como flechas: $r=(L\longleftarrow K\longrightarrow R)$ (ou $L\supseteq K\subseteq R$), em que $K\longrightarrow L$ é injetiva. O grafo $\,K$ é chamado invariante ou algumas vezes grafo colante. Um passo de reescrita ou aplicação de uma regra $\,r$ para um grafo hospedeiro $\,G$ é definido por dois diagramas de pushout, ambos originando-se no mesmo morfismo $k\colon K\longrightarrow G$ (é daqui que o nome "pushout duplo" provém). Um morfismo de grafos $m\colon L\longrightarrow G$ que modela uma ocurrência de $\,L$ em $\,G$ é chamado de casamento. Na prática, $\,L$ é o subgrafo que é casado (ou unificado) com $\,G$ (ver problema do isomorfismo de subgrafos), e depois que um casamento é encontrado, $\,L$ é substituído por $\,R$ em um grafo hospedeiro $\,G$, onde $\,K$ funciona como uma espécie de interface.
Já na abordagem SPO uma regra de reescrita de grafos é um único morfismo na categoria dos multigrafos rotulados, com morfismos parciais entre os grafos como flechas: $r\colon L\longrightarrow R$. Assim, um passo de reescrita é definido por um único diagrama de pushout. Na prática, o processo é similar ao da abordagem DPO; a diferença é que não há interface entre o grafo hospedeiro $\,G$ e grafo $\,G'$, que é o resultado do passo de reescrita.

### Abordagem por sistemas de reescrita de termos

No caso de reescrita de grafos como termos, os grafos têm que ser necessariamente dirigidos, etiquetados e com ordenação nas arestas, e as operações são caracterizadas sobre uma especificação de grafo, definida como:
$\,G=\langle \alpha \,|\,\{\alpha _{1}=t_{1},...,\alpha _{n}=t_{n}\}\rangle$
em que $\,\alpha _{i}$ é um par disjunto de nós (com variáveis) e $\,t_{i}$ um termo. O nó $\,\alpha$ indica a raiz do grafo.
As seguintes propriedades devem ser respeitadas em $p:L\longrightarrow R$:
* $\,L$ não é um nó com uma única variável (então L não é da forma $(x|\emptyset )$ ou $(\alpha |\alpha =x))$
* $VL(R)\subseteq VL(L)$
(sendo $\,VL(x)$ o conjunto de variáveis livres em $\,x$)
Um sistema de reescrita grafos como termos consiste de uma assinatura e um conjunto de regras de reescrita sobre essa assinatura. A assinatura geralmente é deixada implícita.
Um casamento de $\,L$ para $\,G$ é um homomorfismo de $\,L$ em $\,G$, isto é, uma renomeação de variáveis $\sigma$ tal que $L\sigma \subseteq G$
Um redex (instância de uma regra de reescrita) em $\,G$ é determinado pelo par $\,(\rho ,\sigma )$, em que $\rho :L\longrightarrow R$ é uma regra de reescrita com $L\sigma \subseteq G$. A raiz desse redex é o nó $\,\sigma (\alpha )$, em que $\,\alpha$ é a raiz de $\,L$.
A parte do casamento de $\,G$ com relação ao redex $\,(\rho ,\sigma )$ é a coleção de especificações de nós $\,\sigma (\alpha )$ em que $\,\alpha$ é um nó em $\,L$. A especificação da raiz desse redex é a especificação do nó dessa raiz.
E finalmente, um passo de reescrita correpondente ao redex $\,(\rho ,\sigma )$ em $\,G$, denotado por $\rho :L\longrightarrow R$, consiste em substituir a especificação da raiz do redex pelo $\,R\sigma$, com uma boa escolha de variáveis ligadas (para evitar colisões com variáveis em $\,G$). Normalmente se dá destaque à parte relevante do grafo por uma denotação conveniente do "contexto": $G[\sigma (\alpha )=t]\longrightarrow G[R\sigma ]$.

### Outras abordagens

Outra abordagem à reescrita de grafos, conhecida como reescrita determinante de grafos, vem da lógica da Teoria dos bancos de dados. Nessa abordagem, grafos são tratados como instâncias de bancos de dados, e operações de reescrita como um mecanismo para definição de consultas e visões; portanto, todas as reescritas devem possuir resultados únicos (salvo isomorfismo), e isto é conseguido aplicando-se qualquer regra de reescrita concorrentemente ao longo todo o grafo, onde quer que ela se aplique, de modo que o resultado é de fato unicamente definido.

## Implementações e Aplicações

Grafos são um formalismo expressivo, visual e matemática preciso para modelagem de objetos (entidades) ligados por relações binárias; objetos são representados por nós e relações entre eles por arestas. Nós e arestas são normalmente etiquetados. Computações são descritas neste modelo por mudanças nas relações entre as entidades ou por mudanças nas etiquetas dos elementos do grafo. Elas são codificadas nas regras de reescrita/transformação de grafos e executadas por ferramentas de reescrita/transformação de grafos.
* Ferramentas que são aplicáveis a domínios neutros:
** GrGen.NET, o gerador de reescrita de grafos, ferramenta de gera sistemas de reescrita para grafos em C# ou .NET-assembly.