Primeiro, dissipar uma possível dissonância cognitiva: raciocinar sobre estruturas infinitas não é um problema, fazemos isso o tempo todo. Desde que a estrutura seja finamente descritível, isso não é um problema. Aqui estão alguns tipos comuns de estruturas infinitas:
- idiomas (conjuntos de strings sobre algum alfabeto, que podem ser finitos);
- linguagens de árvores (conjuntos de árvores sobre algum alfabeto);
- traços de execução de um sistema não determinístico;
- numeros reais;
- conjuntos de números inteiros;
- conjuntos de funções de números inteiros para números inteiros; ...
Coindutividade como o maior ponto fixo
Onde as definições indutivas constroem uma estrutura a partir de blocos de construção elementares, as definições coindutivas moldam as estruturas de como elas podem ser desconstruídas. Por exemplo, o tipo de lista cujos elementos estão em um conjunto A
é definido da seguinte forma em Coq:
Inductive list (A:Set) : Set :=
| nil : list A
| cons : A -> list A -> list A.
Informalmente, o list
tipo é o menor que contém todos os valores criados pelos construtores nil
e cons
, com o axioma que . Por outro lado, podemos definir o maior tipo que contém todos os valores criados a partir desses construtores, mantendo o axioma da discriminação:∀xy,nil≠consxy
CoInductive colist (A:Set) : Set :=
| conil : colist A
| cocons : A -> colist A -> colist A.
list
é isomórfico para um subconjunto de colist
. Além disso, colist
contém listas infinitas: listas com cocons
upon cocons
.
CoFixpoint flipflop : colist ℕ := cocons 1 (cocons 2 flipflop).
CoFixpoint from (n:ℕ) : colist ℕ := cocons n (from (1 + n)).
flipflop
é o infinito (lista circular) ; é a lista infinita de números naturais .1::2::1::2::…from 0
0::1::2::…
Uma definição recursiva é bem formada se o resultado for construído a partir de blocos menores: as chamadas recursivas devem funcionar com entradas menores. Uma definição corecursiva é bem formada se o resultado criar objetos maiores. A indução olha para os construtores, a coindução olha para os destruidores. Observe como a dualidade não apenas muda de menor para maior, mas também de entradas para saídas. Por exemplo, a razão pela qual as definições flipflop
e from
acima são bem formadas é que a chamada corecursiva é protegida por uma chamada ao cocons
construtor nos dois casos.
Onde declarações sobre objetos indutivos têm provas indutivas, declarações sobre objetos coindutivos têm provas coindutivas. Por exemplo, vamos definir o predicado infinito nas colistas; intuitivamente, os colistas infinitos são os que não terminam conil
.
CoInductive Infinite A : colist A -> Prop :=
| Inf : forall x l, Infinite l -> Infinite (cocons x l).
Para provar que os colistas da forma from n
são infinitos, podemos raciocinar por coindução. from n
é igual a cocons n (from (1 + n))
. Isso mostra que from n
é maior que from (1 + n)
, que é infinito pela hipótese de coindução, portanto from n
é infinito.
Bisimilaridade, uma propriedade coindutora
A coindução como técnica de prova também se aplica a objetos financeiros. Intuitivamente, as provas indutivas sobre um objeto são baseadas em como o objeto é construído. As provas coindutivas são baseadas em como o objeto pode ser decomposto.
Ao estudar sistemas determinísticos, é comum definir equivalência por meio de regras indutivas: dois sistemas são equivalentes se você puder passar de um para o outro por uma série de transformações. Tais definições tendem a falhar em capturar as muitas maneiras diferentes que os sistemas não determinísticos podem acabar tendo o mesmo comportamento (observável), apesar de terem uma estrutura interna diferente. (A coindução também é útil para descrever sistemas sem terminação, mesmo quando são determinísticos, mas não é nisso que vou focar aqui.)
Sistemas não determinísticos, como sistemas concorrentes, geralmente são modelados por sistemas de transição rotulados . Um LTS é um gráfico direcionado no qual as bordas são rotuladas. Cada aresta representa uma possível transição do sistema. Um traço de um LTS é a sequência de rótulos de arestas ao longo de um caminho no gráfico.
Dois LTS podem se comportar de forma idêntica, na medida em que possuem os mesmos traços possíveis, mesmo que sua estrutura interna seja diferente. O isomorfismo do gráfico é muito forte para definir sua equivalência. Em vez disso, é dito que um LTS simula outro LTS se toda transição do segundo LTS admitir uma transição correspondente no primeiro. Formalmente, seja a união disjunta dos estados dos dois LTS, o conjunto (comum) de rótulos e a relação de transição. A relação é uma simulação se
ABSL→R⊆S×S
∀(p,q)∈R, if p→αp′ then ∃q′,q→αq′ and (p′,q′)∈R
A simula se houver uma simulação em que todos os estados de estejam relacionados a um estado em . Se é uma simulação em ambas as direções, isso é chamado de bisimulação . A simulação é uma propriedade coindutiva: qualquer observação de um lado deve corresponder do outro lado.BBAR
Há potencialmente muitos bisimulations em um LTS. Bissimulações diferentes podem identificar estados diferentes. Dadas duas bisimulations e , a relação tomado como o sindicato dos gráficos de relações é em si um bissimulação, já que estados relacionados dão origem a estados relacionados para ambas as relações. (Isso também vale para uniões infinitas. A relação vazia é uma bisimulação incessante, assim como a relação de identidade.) Em particular, a união de todas as bissimulações é ela própria uma bimimulação, chamada bisimilaridade. A bisimilaridade é a maneira mais grosseira de observar um sistema que não distingue entre estados distintos.R1R2R1∪R2
A bisimilaridade é uma propriedade coindutora. Ele pode ser definido como o maior ponto fixo de um operador: é a maior relação que, quando estendida para identificar estados equivalentes, permanece a mesma.
Referências