Open main menu

Changes

3,667 bytes added ,  08:54, 1 June 2016
no edit summary
CoveringRelation(DividesRelation(1,3,5,7,11,13,17));
</pre>
 
== Diagramas de Hasse ==
A relação de abrangência de uma ordem parcial é muitas vezes usada para representar uma ordem parcial. Nós já mencionamos que é mais eficiente (o que exige menos memória), mas também é usada para representar uma ordem parcial graficamente, no sentido de que o diagrama de Hasse é apenas uma representação visual da relação de abrangência da ordem parcial. Nós já temos a maioria das ferramentas de que precisamos para fazer uma primeira tentativa de uma representação visual de uma ordem parcial. As ferramentas de visualização no pacote '''networks''' tornam relativamente fácil de desenhar uma imagem gráfica de uma ordem parcial. Nós simplesmente calculamos sua relação de abrangência, e depois a convertemos para um gráfico e a exibimos como no seguinte procedimento.
 
<pre>
HasseDiagramFirstTry := proc(R::po)
local C;
C := CoveringRelation(R);
networks[draw](MakeDigraph(DomainRelation(C),C));
end:
</pre>
 
Por exemplo, aqui está uma imagem do divisor reticulado de 2100.
 
<pre>
HasseDiagramFirstTry(DivisorLattice(2*3*5*7));
</pre>
 
Infelizmente, esta sofre da desvantagem de não desenhar diagramas Hasse na forma tradicional, com o fim de os elementos representados pelo fluxo do diagrama. Para corrigir isso, precisamos fazer um pouco de codificação. A ideia é organizar os elementos de um ordenado parcialmente definida em níveis, e então usar a opção '''Linear''' para rotina '''draw''' para formar o diagrama mais apropriadamente. Várias rotinas de serviços públicos são necessárias. Esta função é usada para verificar se um elemento é um átomo; isto é, que não tem precedentes. Destina-se a ser utilizado apenas com relações de abrangência '''CR'''. O argumento extra '''D''' é necessário para que possamos localizá-lo mais tarde.
 
<pre>
IsAtom := proc(CR::rel, D::set, a::anything)
local d;
for d in D do
if member([d,a], CR) then
</pre>
encontrou um predecessor:
<pre>
RETURN(false);
fi;
od;
</pre>
deve ser um átomo:
<pre>
RETURN(true);
end:
</pre>
 
Nós usamos isso no próximo procedimento, que determina todos os átomos em um determinado subconjunto de uma relação de cobertura.
 
<pre>
Atoms := proc(CR::rel, D::set)
local A, # set of atoms; returned
d; # index into D
A := {};
for d in D do
if IsAtom(CR, D, d) then
A := A union d;
fi;
od;
RETURN([op(A)]);
end:
</pre>
 
Aqui é a nossa nova implementação do Diagrama de Hasse. A maior parte do novo trabalho envolve a disposição dos elementos do conjunto parcialmente ordenado em uma sequência de níveis para passar para '''Linear''' na rotina '''draw'''.
 
<pre>
HasseDiagram := proc(R::po)
local L, C, G, A, D;
C := CoveringRelation(R);
D := DomainRelation(C); # = DomainRelation(R)
G := MakeDigraph(D, R);
L := NULL;
while D &lt;&gt; {} do
A := Atoms(C, D);
L := L, sort(A);
D := D minus op(A);
od;
networks[draw](Linear(L), G);
end:
</pre>
 
Ela produz imagens muito melhores, com o fluxo, da esquerda para a direita, seguindo aproximadamente os elementos crescentes do conjunto parcialmente ordenado.
 
<pre>
HasseDiagram(DivisorLattice(4));
HasseDiagram(DivisorLattice(6));
HasseDiagram(DivisorLattice(81));
</pre>
 
Os dois seguintes são especialmente bonitos!
 
<pre>
HasseDiagram(DivisorLattice(2*3*5*7));
HasseDiagram(DivisorLattice(2*3*5*2));
</pre>
 
== Cálculos e explorações ==
Nesta seção, vamos explorar como o ''Maple'' pode ser usado para resolver as questões 1, 4 e 5 da secção cálculos e explorações.
 
1- Exibir todas as diferentes relações em um conjunto com 4 elementos.
 
'''Solução:'''
109

edits