Uma Apresentação do Sistema
GAP – Laboratório II
Professores: Osnel Broche Cristo e Anliy Sargeant
Monitor: Junior Assis Barreto Bernardes
Listas: Revisão
gap> L : [6,8,9];; # Elementos entre colchetes e separados por vírgula.
gap> Append(L, [2]);; # Concatena a segunda lista passada no final da
primeira.
gap> Add(L, true); # Adiciona o elemento no final da lista.
gap> L[3]; # Acesso a determinada posição da lista.
9
Listas: Revisão
gap> List([1,2,3], x -> x^3);
[1,8,27]
gap> Length(L); # Retorna a quantidade de elementos da lista.
5
gap> Position(L, 8); # Retorna a posição que o elemento passado ocupa
na lista.
2
Conjuntos
• Os conjuntos são definidos no GAP como listas
densas (sem buracos) e sem repetições, cujos
elementos obedecem uma certa ordem que,
no caso dos números inteiros, deve ser
crescente.
gap> IsSet([1,2,3,4]);
true
gap> IsSet([1,,2,,3,4]);
false
Conjuntos
gap> IsSet([3,2,1]);
false
gap> IsSet([1,2,2,3]);
false
gap> AsSet([1,,3,2,,]);
[1,2,3]
gap> IsSet([“a”, “b”, “c”]);
true
gap> IsSet([“c”, “b”, “a”]);
false
Conjuntos
• Conjuntos Heterogêneos:
gap> IsSet(["a",4,true,3,0,false,8/9,"b",-6]);
false
gap> AsSet(["a",4,true,3,0,false,8/9,"b",-6]);
[ -6, 0, 8/9, 3, 4, true, false, "a", "b" ]
Conjuntos
• Existem funções para adicionar e remover
elementos obedecendo as restrições dos
conjuntos:
gap> S := [2,3,7,11];;
gap> AddSet( S, 5 );
gap> S;
[ 2, 3, 5, 7, 11 ]
gap> RemoveSet(S,7);
gap> S;
[ 2, 3, 5, 11 ]
Álgebra dos Conjuntos
• As operações União, Interseção e Diferença já
estão definidas no sistema.
gap> B := [1,2,3];;
gap> A := [1,5,6];;
gap> Union (A,B);
[1, 2, 3, 5, 6]
gap> Intersection (A,B);
[1]
gap> Difference(A,B);
[5, 6]
gap> Difference(B,A);
[2, 3]
Álgebra dos Conjuntos
• Quando as listas passadas não estão nas condições
necessárias para representarem conjuntos, o
próprio sistema faz uma conversão interna para
executar as operações:
gap> C := [1,2,,,3,3,,2];;
gap> D := [,1,,1,,,5,6,5,6];;
gap> Union(D,C);
[1, 2, 3, 5, 6]
gap> Intersection(D,C);
[1]
gap> Difference(D,C);
[5, 6]
gap> Difference(C,D);
[2, 3]
Álgebra dos Conjuntos
gap> P := [-7, 1, true, "b", "o"];
[ -7, 1, true, "b", "o" ]
gap> Q := [0, false, true, "o"];
[ 0, false, true, "o" ]
gap> Union(P,Q);
[ -7, 0, 1, true, false, "b", "o" ]
gap> Intersection(P,Q);
[ true, "o" ]
gap> Difference(P,Q);
[ -7, 1, "b" ]
gap> Difference(Q,P);
[ 0, false ]
Relações entre Conjuntos
• Igualdade
gap> [1,2,3] = [3,2,1];
false
gap> IsEqualSet([1,2,3],[3,2,1]);
true
gap> IsEqualSet([1,2,3],[1,2,2,3]);
true
gap> IsEqualSet([1,2,3],[1,2,3,4]);
false
gap> IsEqualSet(["a",true,8],[8,true,"a"]);
true
Gap> IsEqualSet([1,2,,3],[1,2,3]);
true
Relações entre Conjuntos
• Subconjunto
gap> IsSubset(Rationals,Integers);
#Obs: A ordem é se o segundo é subconjunto do primeiro.
true
gap> IsSubset([1,2,3,4], [2,3,5]);
false
gap> IsSubset([1,2,3],[2,1]);
true
gap> IsSubset([1,2,,2,3,4,,,5,],[2,1]);
true
gap> IsSubset([1,2,,2,3,4,,,5,],[2,1,2,,5]);
true
Relação Especial
• Pertinência (Entre elemento e conjunto)
gap> 3 in Integers;
true
gap> 2/8 in Integers;
false
gap> 1 in [1,2,3];
true
gap> [1] in [1,2,3];
false
gap> [1] in [[1],[2],[3]];
true
gap> 1 in [[1],[2],[3]];
false
Relações
• Uma relação binária em A é definida como um
subconjunto do produto cartesiano de A com A:
gap> A := [1,2,3];
gap> Cartesian(A,A);
[ [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 2, 1 ], [ 2, 2 ], [ 2, 3 ], [ 3, 1 ],
[ 3, 2 ], [ 3, 3 ] ]
gap> IsBinaryRelation([[1,1],[2,2],[3,3]]);
Error, no method found! For debugging hints type ?Recovery from
NoMethodFound
Error, no 1st choice method found for `IsEndoGeneralMapping' on 1
arguments called from
<function>( <arguments> ) called from read-eval-loop
Entering break read-eval-print loop ...
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
Relações
• A função IdentityBinaryRelation(n) gera a
relação dada pelo diagonal do conjunto dos
inteiros de 1 até n:
gap> R1 := IdentityBinaryRelation(3);
<equivalence relation on <object>
gap> Source(R); #Conjunto
gap> <object>
gap> List(Source(R));
[1 ,2 ,3]
gap> List(UnderlyingRelation(R)); #Elementos
[ Tuple( [ 1, 1 ] ), Tuple( [ 2, 2 ] ), Tuple( [ 3, 3 ] ) ]
Relações
• A função IdentityBinaryRelation também pode ser
aplicada a outros conjuntos:
gap> R2 := IdentityBinaryRelation(Integers);
IdentityMapping( Integers )
gap> Source(R2);
Integers
gap> List(Source(R2));
Error, resulting list would be too large (length
infinity) called from …
Relações
• A função EmptyBinaryRelation(n) gera a relação
vazia no conjunto dos inteiros de 1 até n:
gap> R3 := EmptyBinaryRelation(4);
Binary Relation on 4 points
gap> List(Source(R3));
[ 1, 2, 3, 4 ]
gap> List(UnderlyingRelation(R3));
[ ]
Relações
• A função EmptyBinaryRelation também pode
ser aplicada a outros conjuntos:
gap> R4 := EmptyBinaryRelation(Rationals);
<general mapping: Rationals -> Rationals >
gap> Source(R4);
Rationals
gap> List(Source(R4));
Error, resulting list would be too large (length
infinity) called from
gap> List(UnderlyingRelation(R4));
[ ]
Relações
• A função BinaryRelationByElements(A, R) gera a relação
R do conjunto A:
gap> A := [1,2,3];;
gap>BinaryRelationByElements(A,[[1,1],[2,2],[3,3]]);
Error, <S> and <R> must be domains called from
GeneralMappingByElements( d, d, elms ) called from
<function>( <arguments> ) called from read-eval-loop
Entering break read-eval-print loop ...
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
Relações
•
Como definir relações no sistema usando a
função BinaryRelationByElements(A, R) ?
1) Primeiramente deve-se definir o conjunto A ,
para o sistema o domínio A usando a função
Domain:
gap> A := Domain([1,2,3]);;
Relações
2) Depois define-se os elementos da relação R,
isto é os pares de elementos relacionados
por R, para o sistema as tuplas usando a
função Tuple:
gap>R := [Tuple([1,1]),Tuple([2,2]),Tuple([3,3])];
3) Por fim, define-se a relação em si:
gap> RR := BinaryRelationByElements (A, R);
Relações: Propriedades
gap> IsReflexiveBinaryRelation(R1);
true
gap> IsReflexiveBinaryRelation(R2);
true
gap> IsReflexiveBinaryRelation(R3);
false
gap> IsReflexiveBinaryRelation(R4);
false
gap> IsReflexiveBinaryRelation(RR);
true
Relações: Propriedades
gap> A := Domain(["a","b"]);
<object>
gap> R :=[Tuple(["a","b"])];
[ Tuple( [ a, b ] ) ]
gap> R5 := BinaryRelationByElements(A,R);
<general mapping: <object> -> <object> >
gap> IsBinaryRelation(R5);
true
gap> IsReflexiveBinaryRelation(R5);
false
Relações: Propriedades
gap> IsTransitiveBinaryRelation(R1)
true
gap> IsTransitiveBinaryRelation(R1)
true
gap> IsTransitiveBinaryRelation(R3)
true
gap> IsTransitiveBinaryRelation(R4)
true
gap> IsTransitiveBinaryRelation(RR)
true
gap> IsTransitiveBinaryRelation(R5);
true
Relações: Propriedades
gap> IsSymmetricBinaryRelation(R1);
true
gap> IsSymmetricBinaryRelation(R2);
true
gap> IsSymmetricBinaryRelation(R3);
true
gap> IsSymmetricBinaryRelation(R4);
true
gap> IsSymmetricBinaryRelation(RR);
true
gap> IsSymmetricBinaryRelation(R5);
false
Relações: Propriedades
gap> B := Domain(["a","b"]);
<object>
gap> R :=[Tuple(["a","b"]), Tuple(["b","a"])];
[ Tuple( [ a, b ] ), Tuple( [ b, a ] ) ]
gap> R6 := BinaryRelationByElements(B,R);
<general mapping: <object> -> <object> >
gap> IsBinaryRelation(R6);
true
gap> IsSymmetricBinaryRelation(R6);
true
Relações: Propriedades
gap> IsAntisymmetricBinaryRelation(R1);
true
gap> IsAntisymmetricBinaryRelation(R2);
true
gap> IsAntisymmetricBinaryRelation(R3);
true
gap> IsAntisymmetricBinaryRelation(R4);
true
gap> IsAntisymmetricBinaryRelation(RR);
true
gap> IsAntisymmetricBinaryRelation(R6);
false
Funções (Mappings)
• Função é um caso particular de relação. Assim, está
definida analogamente no sistema:
gap> S := Domain([1,2,3]);
<object>
gap> R := Domain([1,2,3,4,5]);
<object>
gap> elms := [Tuple([1,5]),Tuple([3,4])];
[ Tuple( [ 1, 5 ] ), Tuple( [ 3, 4 ] ) ]
gap> F := GeneralMappingByElements(S,R,elms);
<general mapping: <object> -> <object> >
Funções (Mappings)
• Outra maneira de definir:
gap> B := Domain([1,2,3]);
gap> G := MappingByFunction(B,Integers,x->x^2);
MappingByFunction( <object>, <object>, function( x ) ... end )
gap> UnderlyingRelation(G);
<object>
gap> List(last);
[ Tuple( [ 1, 1 ] ), Tuple( [ 2, 4 ] ), Tuple( [ 3, 9 ] ) ]
Funções: Propriedades
gap> IsSurjective(F);
false
gap> IsSurjective(G);
false
gap> IsInjective(G);
true
gap> IsInjective(F);
true
gap> IsBijective(F);
false
gap> IsBijective(G);
false
Funções: Propriedades
gap> F := Domain([-1,-2,-3]);
<object>
gap> H := MappingByFunction(Integers,F,x -> x^2);
MappingByFunction( <object>, <object>, function( x ) ... end )
gap> IsInjective(last);
false
gap> IsBijective(H);
false
Funções: Propriedade
gap> A := Domain(["a","b","c"]);
<object>
gap> B := Domain(["a","b","c"]);
<object>
gap> R :=[Tuple(["a","b"]), Tuple(["b","a"]),
Tuple(["c","c"])];
[ Tuple( [ a, b ] ), Tuple( [ b, a ] ), Tuple( [ c, c ] ) ]
gap> F2 := GeneralMappingByElements(A,B,R);
<general mapping: <object> -> <object> >
Funções: Propriedades
gap> List(UnderlyingRelation(F2));
[ Tuple( [ a, b ] ), Tuple( [ b, a ] ), Tuple( [ c, c ] ) ]
gap> IsInjective(F2);
true
gap> IsSurjective(F2);
true
gap> IsBijective(F2);
true
Funções (Programação)
• gap> cubo := x -> x^3;
function( x ) ... end
gap> cubo(5);
125
• function ([argumentos f, argumentos g])
local identicador local f, identicador local g;
instruções;
end;
Funções (Programação)
• gap> fat := function(n)
> local f,i; # Variaveis locais
> f := 1;
> for i in [1 .. n] do
> f := f*i;
> od;
> return f; # Retorno da função.
> end;
Funções (Programação)
• gap> fatorial := function(n)
> if n = 0 then
> return 1;
> else
> return n*fatorial(n-1); #Chamada recursiva, também
presente no GAP.
> fi ;
> end;
Download

Uma Apresentação do Sistema GAP – Laboratório II