1 @c English version: 1.17
3 * Introdução a Conjuntos::
4 * Definições para Conjuntos::
7 @node Introdução a Conjuntos, Definições para Conjuntos, Conjuntos, Conjuntos
8 @section Introdução a Conjuntos
10 Maxima fornece funções de conjunto, tais como
11 intersecção e união, para conjuntos finitos que são
12 definidos por enumeração explícita.
13 Maxima trata listas e conjuntos como objectos distintos. Este recurso
14 torna possível trabalhar com conjuntos que possuem
15 elementos que são ou listas ou conjuntos.
17 Adicionalmente, para funções de conjuntos finitos,
18 Maxima fornece algumas funções relacionadas com
19 análise combinatória: números de Stirling de primeiro e de segundo
20 tipo, números de Bell, coeficientes multinomiais e
21 partições de inteiros não negativos, entre
22 outras. Maxima também define a função delta de
25 @subsection Utilização
27 Para construir um conjunto com elementos @code{a_1, ..., a_n}, escreva
28 @code{set(a_1, ..., a_n)} ou @code{@{a_1, ..., a_n@}}; para construir o
29 conjunto vazio, escreva @code{set()} ou @code{@{@}}. Para
30 inserção de dados, @code{set(...)} e @code{@{ ... @}}
31 são equivalentes. Os conjuntos são sempre mostrados entre chaves
34 Se um elemento é listado mais de uma vez, o simplificador do Maxima
35 elimina o elemento redundante.
66 Dois elementos @var{x} e @var{y} são redundantes (nomeadamente,
67 considerados o mesmo para propósito de construção de
68 conjuntos) se e somente se @code{is(@var{x} = @var{y})} retornar
70 @c THAT IS BECAUSE THE SET SIMPLIFICATION CODE CALLS THE LISP FUNCTION LIKE,
71 @c AND SO DOES THE CODE TO EVALUATE IS (X = Y).
72 Note que @code{is(equal(@var{x}, @var{y}))} pode retornar @code{true}
73 enquanto @code{is(@var{x} = @var{y})} retorna @code{false}; nesse caso
74 os elementos @var{x} e @var{y} são considerados distintos.
104 (%i6) is (equal (y, z));
108 (%o7) - ----- + - + -
114 (%o9) @{-----, - + -@}
118 Para construir um conjunto dos elementos de uma lista, use @code{setify}.
124 (%i1) setify ([b, a]);
128 Os elementos de conjunto @code{x} e @code{y} serão considerados iguais
129 se @code{is(x = y)} for avaliando para @code{true}. Dessa forma,
130 @code{rat(x)} e @code{x} são iguais como elementos de conjunto;
141 Adicionalmente, uma vez que @code{is((x - 1)*(x + 1) = x^2 - 1)} avalia
142 para @code{false}, @code{(x - 1)*(x + 1)} e @code{x^2 - 1} são
143 considerados elementos de conjunto diferentes; dessa forma
146 @c {(x - 1)*(x + 1), x^2 - 1};
149 (%i1) @{(x - 1)*(x + 1), x^2 - 1@};
151 (%o1) @{(x - 1) (x + 1), x - 1@}
154 Para reduzir esse conjunto a um conjunto simples, apliquemos @code{rat}
155 a cada elemento do conjunto
158 @c {(x - 1)*(x + 1), x^2 - 1};
162 (%i1) @{(x - 1)*(x + 1), x^2 - 1@};
164 (%o1) @{(x - 1) (x + 1), x - 1@}
170 Para remover redundâncias em outros conjuntos, poderá ter que usar
171 outras funções de simplificação. Aqui
172 está um exemplo que usa @code{trigsimp}:
175 @c {1, cos(x)^2 + sin(x)^2};
176 @c map (trigsimp, %);
179 (%i1) @{1, cos(x)^2 + sin(x)^2@};
181 (%o1) @{1, sin (x) + cos (x)@}
182 (%i2) map (trigsimp, %);
186 Um conjunto está simplificado quando os seus elementos não são
187 redundantes e o conjunto está ordenado. A versão actual das
188 funções de conjunto usam a função
189 @code{orderlessp} do Maxima para ordenar conjuntos; contudo,
190 @emph{versões futuras das funções de conjunto poderão
191 vir a usar uma função de ordenação
194 Algumas operações sobre conjuntos, tais como
195 substituições, forçam automaticamente a
196 uma re-simplificação; por exemplo,
201 @c subst ([a=x, b=x, c=x], s);
202 @c map (lambda ([x], x^2), set (-1, 0, 1));
205 (%i1) s: @{a, b, c@}$
206 (%i2) subst (c=a, s);
208 (%i3) subst ([a=x, b=x, c=x], s);
210 (%i4) map (lambda ([x], x^2), set (-1, 0, 1));
214 Maxima trata listas e conjuntos como objectos distintos;
215 funções tais como @code{union} e @code{intersection}
216 produzem um erro se qualquer argumento não for um conjunto. se
217 precisar aplicar uma função de conjunto a uma lista, use
218 a função @code{setify} para converter essa lista num
219 conjunto. Dessa forma
222 @c union ([1, 2], {a, b});
223 @c union (setify ([1, 2]), {a, b});
226 (%i1) union ([1, 2], @{a, b@});
227 Function union expects a set, instead found [1,2]
228 -- an error. Quitting. To debug this try debugmode(true);
229 (%i2) union (setify ([1, 2]), @{a, b@});
233 Para extrair todos os elementos de um conjunto @code{s} que satisfazem
234 um predicado @code{f}, use @code{subset(s, f)}. (Um @i{predicado} é um
235 uma função que avalia para os valores booleanos
236 @code{true}/@code{false}.) Por exemplo, para encontrar as
237 equações num dado conjunto que não depende de uma
238 variável @code{z}, use
241 @c subset ({x + y + z, x - y + 4, x + y - 5}, lambda ([e], freeof (z, e)));
244 (%i1) subset (@{x + y + z, x - y + 4, x + y - 5@}, lambda ([e], freeof (z, e)));
245 (%o1) @{- y + x + 4, y + x - 5@}
248 A secção @emph{Definições para
249 Conjuntos} possui uma lista completa das funções de
252 @subsection Iterações entre Elementos de Conjuntos
254 Existem duas formas de fazer iterações sobre elementos
255 de conjuntos. Uma forma é usar @code{map}; por exemplo:
258 @c map (f, {a, b, c});
261 (%i1) map (f, @{a, b, c@});
262 (%o1) @{f(a), f(b), f(c)@}
265 A outra forma consiste em usar @code{for @var{x} in @var{s} do}
269 @c for si in s do print (concat (si, 1));
272 (%i1) s: @{a, b, c@};
274 (%i2) for si in s do print (concat (si, 1));
281 As funções @code{first} e @code{rest} do Maxima
282 trabalham actualmente sobre conjuntos. Aplicada a um conjunto,
283 @code{first} retorna o primeiro elemento mostrado de um conjunto; qual o
284 élemento que será mostrado dependerá da
285 implementação. Se @code{s} for um conjunto, então
286 @code{rest(s)} é equivalente a @code{disjoin(first(s), s)}.
287 Actualmente, existem outras funções do Maxima que
288 trabalham correctamente sobre conjuntos. Em versões futuras das
289 funções de conjunto, @code{first} e @code{rest} podem
290 vir a funcionar diferentemente ou deixar de funcionar.
294 As funções de conjunto usam a função
295 @code{orderlessp} do Maxima para organizar os elementos dum conjunto e a
296 função (a nível do Lisp) @code{like} para
297 testar a igualdade entre elementos de conjuntos. Ambas essas
298 funções possuem falhas conhecidas que podem se
299 manifestar quando tentar usar conjuntos com elementos que são listas
300 ou matrizes que contenham expressões na forma racional canónica
307 (%i1) @{[x], [rat (x)]@};
308 Maxima encountered a Lisp error:
310 The value #:X1440 is not of type LIST.
312 Automatically continuing.
313 To reenable the Lisp debugger set *debugger-hook* to nil.
316 Essa expressão faz com que o Maxima produza um erro (a mensagem de
317 erro dependerá da versão do Lisp que o Maxima estiver a
318 utilizar). Outro exemplo é
321 @c setify ([[rat(a)], [rat(b)]]);
324 (%i1) setify ([[rat(a)], [rat(b)]]);
325 Maxima encountered a Lisp error:
327 The value #:A1440 is not of type LIST.
329 Automatically continuing.
330 To reenable the Lisp debugger set *debugger-hook* to nil.
333 Essas falhas são causadas por falhas em @code{orderlessp} e
334 @code{like}, e não por falhas nas funções de
335 conjunto. Para ilustrar, experimente as expressões
338 @c orderlessp ([rat(a)], [rat(b)]);
339 @c is ([rat(a)] = [rat(a)]);
342 (%i1) orderlessp ([rat(a)], [rat(b)]);
343 Maxima encountered a Lisp error:
345 The value #:B1441 is not of type LIST.
347 Automatically continuing.
348 To reenable the Lisp debugger set *debugger-hook* to nil.
349 (%i2) is ([rat(a)] = [rat(a)]);
353 Até que essas falhas forem corrigidas, não construa conjuntos com
354 elementos que sejam listas ou matrizes contendo expressões na forma
355 racional canónica (CRE); um conjunto com um elemento na forma CRE,
356 contudo, pode não ser um problema:
362 (%i1) @{x, rat (x)@};
366 A @code{orderlessp} do Maxima possui outra falha que pode causar
367 problemas com funções de conjunto; nomeadamente, o
368 predicado de ordenação @code{orderlessp} não é
369 transitivo. O mais simples exemplo conhecido que mostra isso é
375 @c orderlessp (q, r);
376 @c orderlessp (r, s);
377 @c orderlessp (q, s);
383 (%i4) orderlessp (q, r);
385 (%i5) orderlessp (r, s);
387 (%i6) orderlessp (q, s);
391 Essa falha pode causar problemas com todas as funções de
392 conjunto bem como com funções do Maxima em geral. É
393 provável, mas não certo, que essa falha possa ser evitada se todos
394 os elementos do conjunto estiverem ou na forma CRE ou tiverem sido
395 simplificados usando @code{ratsimp}.
397 @c WHAT EXACTLY IS THE EFFECT OF ordergreat AND orderless ON THE SET FUNCTIONS ??
398 Os mecanismos @code{orderless} e @code{ordergreat} do Maxima são
399 incompatíveis com as funções de
400 conjunto. Se precisar usar @code{orderless} ou @code{ordergrreat}, chame
401 todas essas funções antes de construir quaisquer
402 conjuntos, e não use @code{unorder}.
404 @c APPARENTLY THIS NEXT BIT REFERS TO BUG REPORT 798571
405 @c EXAMPLE WITH kron_delta (1/sqrt(2), sqrt(2)/2); NOW WORKS AS EXPECTED
406 @c COMMENT OUT PENDING CONSTRUCTION OF ANOTHER EXAMPLE WHICH TRIGGERS THE BUG
408 @c Maxima's sign function has a bug that may cause the Kronecker
409 @c delta function to misbehave; for example:
412 @c @c kron_delta (1/sqrt(2), sqrt(2)/2);
415 @c (%i1) kron_delta (1/sqrt(2), sqrt(2)/2);
419 @c The correct value is 1; the bug is related to the @code{sign} bug
422 @c @c sign (1/sqrt(2) - sqrt(2)/2);
425 @c (%i1) sign (1/sqrt(2) - sqrt(2)/2);
429 Se encontrar alguma coisa que pense ser uma falha em alguma
430 função de conjunto, por favor relate isso para a base de
431 dados de falhas do Maxima. Veja @code{bug_report}.
435 Stavros Macrakis de Cambridge, Massachusetts e Barton Willis da
436 Universidade de Nebraska e Kearney (UNK) escreveram as
437 fnções de conjunto do Maxima e sua
440 @node Definições para Conjuntos, , Introdução a Conjuntos, Conjuntos
441 @section Definições para Conjuntos
444 @deffn {Função} adjoin (@var{x}, @var{a})
446 Calcula a união do conjunto @var{a} com @code{@{@var{x}@}}.
448 @code{adjoin} falha se @var{a} não for um conjunto literal.
450 @code{adjoin(@var{x}, @var{a})} e @code{union(set(@var{x}), @var{a})}
451 são equivalentes; contudo, @code{adjoin} pode ser um pouco mais
452 rápida que @code{union}.
454 Veja também @code{disjoin}.
459 @c adjoin (c, {a, b});
460 @c adjoin (a, {a, b});
463 (%i1) adjoin (c, @{a, b@});
465 (%i2) adjoin (a, @{a, b@});
472 @deffn {Função} belln (@var{n})
474 Representa o @math{n}-ésimo número de Bell. @code{belln(n)} é o
475 número de partições de um conjunto de @var{n}
478 Para inteiros não negativos @var{n}, @code{belln(@var{n})} simplifica
479 para o @math{n}-ésimo número de Bell. @code{belln} não simplifica
480 para qualquer outro tipo de argumento.
482 @code{belln}, aplicada a equações, listas, matrizes
483 e conjuntos, é calculada em forma distributiva.
487 @code{belln} aplicado a inteiros não negativos.
490 @c makelist (belln (i), i, 0, 6);
491 @c is (cardinality (set_partitions ({})) = belln (0));
492 @c is (cardinality (set_partitions ({1, 2, 3, 4, 5, 6})) = belln (6));
495 (%i1) makelist (belln (i), i, 0, 6);
496 (%o1) [1, 1, 2, 5, 15, 52, 203]
497 (%i2) is (cardinality (set_partitions (@{@})) = belln (0));
499 (%i3) is (cardinality (set_partitions (@{1, 2, 3, 4, 5, 6@})) = belln (6));
503 @code{belln} aplicado a argumentos que não são inteiros não negativos.
506 @c [belln (x), belln (sqrt(3)), belln (-9)];
509 (%i1) [belln (x), belln (sqrt(3)), belln (-9)];
510 (%o1) [belln(x), belln(sqrt(3)), belln(- 9)]
516 @deffn {Função} cardinality (@var{a})
518 Calcula o número de elementos distintos do conjunto @var{a}.
520 @code{cardinality} ignora elementos redundantes mesmo quando a
521 simplificação não estiver habilitada.
527 @c cardinality ({a, a, b, c});
529 @c cardinality ({a, a, b, c});
532 (%i1) cardinality (@{@});
534 (%i2) cardinality (@{a, a, b, c@});
538 (%i4) cardinality (@{a, a, b, c@});
544 @anchor{cartesian_product}
545 @deffn {Função} cartesian_product (@var{b_1}, ... , @var{b_n})
546 Retorna um conjunto de listas da forma @code{[@var{x_1}, ...,
547 @var{x_n}]}, onde @var{x_1}, ..., @var{x_n} são elementos dos
548 conjuntos @var{b_1}, ... , @var{b_n}, respectivamente.
550 @code{cartesian_product} falha se qualquer argumento não for um
556 @c cartesian_product ({0, 1});
557 @c cartesian_product ({0, 1}, {0, 1});
558 @c cartesian_product ({x}, {y}, {z});
559 @c cartesian_product ({x}, {-1, 0, 1});
562 (%i1) cartesian_product (@{0, 1@});
564 (%i2) cartesian_product (@{0, 1@}, @{0, 1@});
565 (%o2) @{[0, 0], [0, 1], [1, 0], [1, 1]@}
566 (%i3) cartesian_product (@{x@}, @{y@}, @{z@});
568 (%i4) cartesian_product (@{x@}, @{-1, 0, 1@});
569 (%o4) @{[x, - 1], [x, 0], [x, 1]@}
575 @deffn {Função} disjoin (@var{x}, @var{a})
576 Retorna o conjunto @var{a} sem o elemento @var{x}. Se @var{x} não for
577 um elemento de @var{a}, retorna @var{a} sem
580 @code{disjoin} reclama se @var{a} não for um conjunto literal.
582 @code{disjoin(@var{x}, @var{a})}, @code{delete(@var{x}, @var{a})}, e
583 @code{setdifference(@var{a}, set(@var{x}))} são todos equivalentes.
584 Desses, @code{disjoin} é geralmente mais rápido que os outros.
589 @c disjoin (a, {a, b, c, d});
590 @c disjoin (a + b, {5, z, a + b, %pi});
591 @c disjoin (a - b, {5, z, a + b, %pi});
594 (%i1) disjoin (a, @{a, b, c, d@});
596 (%i2) disjoin (a + b, @{5, z, a + b, %pi@});
598 (%i3) disjoin (a - b, @{5, z, a + b, %pi@});
599 (%o3) @{5, %pi, b + a, z@}
605 @deffn {Função} disjointp (@var{a}, @var{b})
606 Retorna @code{true} se e somente se os conjuntos @var{a} e @var{b} forem
609 @code{disjointp} falha se ou @var{a} ou @var{b} não forem conjuntos
615 @c disjointp ({a, b, c}, {1, 2, 3});
616 @c disjointp ({a, b, 3}, {1, 2, 3});
619 (%i1) disjointp (@{a, b, c@}, @{1, 2, 3@});
621 (%i2) disjointp (@{a, b, 3@}, @{1, 2, 3@});
628 @deffn {Função} divisors (@var{n})
630 Representa o conjunto dos divisores de @var{n}.
632 @code{divisors(@var{n})} produz um conjunto de divisores inteiros quando
633 @var{n} for um inteiro não nulo. O conjunto dos divisores inclui os
634 elementos 1 e @var{n}. Os divisores de um inteiro negativo são os
635 divisores do seu valor absoluto.
637 @code{divisors}, aplicada a equações, listas, matrizes
638 e conjuntos, é calculada em forma distributiva.
642 Podemos verificar que 28 é um número perfeito: a
643 adição dos seus divisores (excepto o próprio 28) é
648 @c lreduce ("+", args(s)) - 28;
651 (%i1) s: divisors(28);
652 (%o1) @{1, 2, 4, 7, 14, 28@}
653 (%i2) lreduce ("+", args(s)) - 28;
657 @code{divisors} é uma função de
658 simplificação. Substituindo 8 por @code{a} em
659 @code{divisors(a)} calcula os divisores sem ser preciso pedir que
660 @code{divisors(8)} seja reavaliada.
669 (%i2) subst (8, a, %);
673 @code{divisors}, aplicada a equações, listas, matrizes
674 e conjuntos, é calculada em forma distributiva.
678 @c divisors ([a, b, c]);
679 @c divisors (matrix ([a, b], [c, d]));
680 @c divisors ({a, b, c});
683 (%i1) divisors (a = b);
684 (%o1) divisors(a) = divisors(b)
685 (%i2) divisors ([a, b, c]);
686 (%o2) [divisors(a), divisors(b), divisors(c)]
687 (%i3) divisors (matrix ([a, b], [c, d]));
688 [ divisors(a) divisors(b) ]
690 [ divisors(c) divisors(d) ]
691 (%i4) divisors (@{a, b, c@});
692 (%o4) @{divisors(a), divisors(b), divisors(c)@}
697 @deffn {Função} elementp (@var{x}, @var{a})
698 Retorna @code{true} se e somente se @var{x} for um elemento do conjunto
701 @code{elementp} falha se @var{a} não for um conjunto literal.
706 @c elementp (sin(1), {sin(1), sin(2), sin(3)});
707 @c elementp (sin(1), {cos(1), cos(2), cos(3)});
710 (%i1) elementp (sin(1), @{sin(1), sin(2), sin(3)@});
712 (%i2) elementp (sin(1), @{cos(1), cos(2), cos(3)@});
719 @deffn {Função} emptyp (@var{a})
720 Retorna @code{true} se e somente se @var{a} for o conjunto vazio ou uma
726 @c map (emptyp, [{}, []]);
727 @c map (emptyp, [a + b, {{}}, %pi]);
730 (%i1) map (emptyp, [@{@}, []]);
732 (%i2) map (emptyp, [a + b, @{@{@}@}, %pi]);
733 (%o2) [false, false, false]
737 @anchor{equiv_classes}
738 @deffn {Função} equiv_classes (@var{s}, @var{F})
739 Retorna um conjunto das classes de equivalências do conjunto @var{s}
740 com relação à relação de
741 equivalência @var{F}.
743 @var{F} é uma função de duas variáveis definida
744 sobre o produto cartesiano @var{s} por @var{s}. O valor de retorno de
745 @var{F} é ou @code{true} ou @code{false}, ou uma expressão
746 @var{expr} tal que @code{is(@var{expr})} é ou @code{true} ou
749 Quando @var{F} não for uma relação de equivalência,
750 @code{equiv_classes} aceita-a sem reclamação,
751 mas o resultado é geralmente incorrecto nesse caso.
753 @c EXCESSIVE DETAIL HERE. PROBABLY JUST CUT THIS
754 @c @var{F} may be a relational operator (built-in or user-defined),
755 @c an ordinary Maxima function, a Lisp function, a lambda expression,
756 @c a macro, or a subscripted function.
760 A relação de equivalência é uma expressão lambda a
761 qual retorna @code{true} ou @code{false}.
764 @c equiv_classes ({1, 1.0, 2, 2.0, 3, 3.0}, lambda ([x, y], is (equal (x, y))));
767 (%i1) equiv_classes (@{1, 1.0, 2, 2.0, 3, 3.0@}, lambda ([x, y], is (equal (x, y))));
768 (%o1) @{@{1, 1.0@}, @{2, 2.0@}, @{3, 3.0@}@}
771 A relação de equivalência é o nome de uma
772 função relacional que avalia para @code{true} ou
776 @c equiv_classes ({1, 1.0, 2, 2.0, 3, 3.0}, equal);
779 (%i1) equiv_classes (@{1, 1.0, 2, 2.0, 3, 3.0@}, equal);
780 (%o1) @{@{1, 1.0@}, @{2, 2.0@}, @{3, 3.0@}@}
783 As classes de equivalência são números que diferem por um múltiplo
787 @c equiv_classes ({1, 2, 3, 4, 5, 6, 7}, lambda ([x, y], remainder (x - y, 3) = 0));
790 (%i1) equiv_classes (@{1, 2, 3, 4, 5, 6, 7@}, lambda ([x, y], remainder (x - y, 3) = 0));
791 (%o1) @{@{1, 4, 7@}, @{2, 5@}, @{3, 6@}@}
796 @deffn {Função} every (@var{f}, @var{s})
797 @deffnx {Função} every (@var{f}, @var{L_1}, ..., @var{L_n})
799 Retorna @code{true} se o predicado @var{f} for @code{true} para todos os
800 argumentos fornecidos.
802 Dado um conjunto como segundo argumento, @code{every(@var{f}, @var{s})}
803 retorna @code{true} se @code{is(@var{f}(@var{a_i}))} retornar
804 @code{true} para todos os @var{a_i} em @var{s}. @code{every} pode ou
805 não avaliar @var{f} para todos os @var{a_i} em @var{s}. Uma vez que
806 os conjuntos são desordenados, @code{every} pode avaliar
807 @code{@var{f}(@var{a_i})} em qualquer ordem.
809 Dada uma ou mais listas como argumentos, @code{every(@var{f}, @var{L_1},
810 ..., @var{L_n})} retorna @code{true} se @code{is(@var{f}(@var{x_1}, ...,
811 @var{x_n}))} retornar @code{true} para todos os @var{x_1}, ...,
812 @var{x_n} em @var{L_1}, ..., @var{L_n}, respectivamente. @code{every}
813 pode ou não avaliar @var{f} para toda combinação
814 @var{x_1}, ..., @var{x_n}. @code{every} avalia listas na ordem de
815 incremento do índice.
817 Dado um conjunto vazio @code{@{@}} ou uma lista vazia @code{[]} como
818 argumentos, @code{every} retorna @code{false}.
820 Quando o sinalizador global @code{maperror} for @code{true}, todas as
821 listas @var{L_1}, ..., @var{L_n} deverão ter o mesmo comprimento.
822 Quando @code{maperror} for falso, as listas dadas como argumentos
823 serão efectivamente truncadas para o comprimento da menor lista.
825 Os resultados do predicado @var{f} que avaliarem (via @code{is}) para
826 algo diferente de @code{true} ou @code{false} são governados através
827 da variável global @code{prederror}. Quando @code{prederror} for
828 @code{true}, tais valores são tratados como @code{false}, e o valor de
829 retorno de @code{every} é @code{false}. Quando @code{prederror} for
830 @code{false}, tais valores são tratados como @code{unknown}, e o valor
831 de retorno de @code{every} é @code{unknown}.
835 @code{every} aplicada a um conjunto simples. O predicado é uma
836 função de um argumento.
839 @c every (integerp, {1, 2, 3, 4, 5, 6});
840 @c every (atom, {1, 2, sin(3), 4, 5 + y, 6});
843 (%i1) every (integerp, @{1, 2, 3, 4, 5, 6@});
845 (%i2) every (atom, @{1, 2, sin(3), 4, 5 + y, 6@});
849 @code{every} aplicada a duas listas. O predicado é uma
850 função de dois argumentos.
853 @c every ("=", [a, b, c], [a, b, c]);
854 @c every ("#", [a, b, c], [a, b, c]);
857 (%i1) every ("=", [a, b, c], [a, b, c]);
859 (%i2) every ("#", [a, b, c], [a, b, c]);
863 Predicado @var{f} que produz resultados diferentes de @code{true} ou
864 @code{false}, governados por meio da variável global @code{prederror}.
867 @c prederror : false;
868 @c map (lambda ([a, b], is (a < b)), [x, y, z], [x^2, y^2, z^2]);
869 @c every ("<", [x, y, z], [x^2, y^2, z^2]);
871 @c every ("<", [x, y, z], [x^2, y^2, z^2]);
874 (%i1) prederror : false;
876 (%i2) map (lambda ([a, b], is (a < b)), [x, y, z], [x^2, y^2, z^2]);
877 (%o2) [unknown, unknown, unknown]
878 (%i3) every ("<", [x, y, z], [x^2, y^2, z^2]);
880 (%i4) prederror : true;
882 (%i5) every ("<", [x, y, z], [x^2, y^2, z^2]);
888 @anchor{extremal_subset}
889 @deffn {Função} extremal_subset (@var{s}, @var{f}, max)
890 @deffnx {Função} extremal_subset (@var{s}, @var{f}, min)
892 Encontra o subconjunto de @var{s} para o qual a função
893 @var{f} toma valores máximos ou mínimos.
895 @code{extremal_subset(@var{s}, @var{f}, max)} encontra o subconjunto do
896 conjunto ou lista @var{s} para os quais a função real
897 @var{f} assume um valor máximo.
899 @code{extremal_subset(@var{s}, @var{f}, min)} encontra o subconjunto do
900 conjunto ou lista @var{s} para a qual a função real
901 @var{f} assume um valor mínimo.
906 @c extremal_subset ({-2, -1, 0, 1, 2}, abs, max);
907 @c extremal_subset ({sqrt(2), 1.57, %pi/2}, sin, min);
910 (%i1) extremal_subset (@{-2, -1, 0, 1, 2@}, abs, max);
912 (%i2) extremal_subset (@{sqrt(2), 1.57, %pi/2@}, sin, min);
918 @deffn {Função} flatten (@var{expr})
920 Colecta argumentos de subexpressões que possuem o mesmo operador que
921 @var{expr} e constrói uma expressão a partir desses argumentos
924 Subexpressões nas quais o operador é diferente do operador principal
925 de @code{expr} são copiadas sem modificação, mesmo se
926 tiverem subexpressões com o mesmo operador que @code{expr}.
928 É possível que @code{flatten} construia expressões nas
929 quais o número de argumentos difira dos argumentos declarados para um
930 operador; isso pode provocar uma mensagem de erro do simplificador ou do
931 avaliador. @code{flatten} não tenta detectar tais
934 Expressões com representações especiais, por exemplo,
935 expressões racionais canónicas (CRE), não podem usar a
936 função @code{flatten}; nesses casos, @code{flatten}
937 retorna os seus argumentos sem modificação.
941 Aplicado a uma lista, @code{flatten} reúne todos os elementos da
942 lista que sejam listas.
945 @c flatten ([a, b, [c, [d, e], f], [[g, h]], i, j]);
948 (%i1) flatten ([a, b, [c, [d, e], f], [[g, h]], i, j]);
949 (%o1) [a, b, c, d, e, f, g, h, i, j]
952 Aplicado a um conjunto, @code{flatten} reúne todos os elementos do
953 conjunto que sejam conjuntos.
956 @c flatten ({a, {b}, {{c}}});
957 @c flatten ({a, {[a], {a}}});
960 (%i1) flatten (@{a, @{b@}, @{@{c@}@}@});
962 (%i2) flatten (@{a, @{[a], @{a@}@}@});
966 o efeito de @code{flatten} é similar a declarar o operador principal
967 para ser enário. No entanto, @code{flatten} não faz efeito sobre
968 subexpressões que possuem um operador diferente do operador principal,
969 enquanto uma declaração enária faz efeito.
972 @c expr: flatten (f (g (f (f (x)))));
973 @c declare (f, nary);
977 (%i1) expr: flatten (f (g (f (f (x)))));
979 (%i2) declare (f, nary);
985 @code{flatten} trata funções subscritas da mesma forma
986 que qualquer outro operador.
989 @c flatten (f[5] (f[5] (x, y), z));
992 (%i1) flatten (f[5] (f[5] (x, y), z));
997 É possível que @code{flatten} construa expressões nas
998 quais o número de argumentos difira dos argumentos declarados para um
1002 @c 'mod (5, 'mod (7, 4));
1007 (%i1) 'mod (5, 'mod (7, 4));
1008 (%o1) mod(5, mod(7, 4))
1012 Wrong number of arguments to mod
1013 -- an error. Quitting. To debug this try debugmode(true);
1017 @anchor{full_listify}
1018 @deffn {Função} full_listify (@var{a})
1019 Substitui todo operador de conjunto em @var{a} por um operador de lista,
1020 e retorna o resultado. @code{fullt_listify} substitui operadores de
1021 conjunto em subexpressões aninhadas, mesmo se o operador principal
1022 não for (@code{set}).
1024 @code{listify} substitui unicamente o operador principal.
1029 @c full_listify ({a, b, {c, {d, e, f}, g}});
1030 @c full_listify (F (G ({a, b, H({c, d, e})})));
1033 (%i1) full_listify (@{a, b, @{c, @{d, e, f@}, g@}@});
1034 (%o1) [a, b, [c, [d, e, f], g]]
1035 (%i2) full_listify (F (G (@{a, b, H(@{c, d, e@})@})));
1036 (%o2) F(G([a, b, H([c, d, e])]))
1042 @deffn {Função} fullsetify (@var{a})
1043 Quando @var{a} for uma lista, substitui o operador de lista por um
1044 operador de conjunto, e aplica @code{fullsetify} a cada elemento que for
1045 um conjunto. Quando @var{a} não for uma lista, o resultado é
1046 @var{a} na sua forma original e sem modificações.
1048 @code{setify} substitui unicamente o operador principal.
1052 Na linha (%o2), o argumento de @code{f} não é convertido para um
1053 conjunto porque o operador principal de @code{f([b])} não é uma
1057 @c fullsetify ([a, [a]]);
1058 @c fullsetify ([a, f([b])]);
1061 (%i1) fullsetify ([a, [a]]);
1063 (%i2) fullsetify ([a, f([b])]);
1070 @deffn {Função} identity (@var{x})
1072 Retorna @var{x} para qualquer argumento @var{x}.
1076 @code{identity} pode ser usado como um predicado quando os argumentos
1077 forem valores Booleanos.
1080 @c every (identity, [true, true]);
1083 (%i1) every (identity, [true, true]);
1088 @anchor{integer_partitions}
1089 @deffn {Função} integer_partitions (@var{n})
1090 @deffnx {Função} integer_partitions (@var{n}, @var{len})
1092 Calcula partições inteiras de @var{n}, isto é, listas
1093 de inteiros cuja soma dos elementos de cada lista é @var{n}.
1095 @code{integer_partitions(@var{n})} encontra o conjunto de todas as
1096 partições do inteiro @var{n}. Cada
1097 partição é uma lista ordenada do maior para o menor.
1099 @code{integer_partitions(@var{n}, @var{len})} encontra todas as
1100 partições com comprimento @var{len} ou menor; nesse
1101 caso, serão adicionados zeros ao final de cada
1102 partição de comprimento menor que @var{len}, para fazer
1103 com que todas as partições tenham exactamente @var{len} termos.
1104 Cada partição é uma lista ordenada do maior para o
1107 Uma lista @math{[a_1, ..., a_m]} é uma partição de um
1108 inteiro não negativo @math{n} quando: (1) cada @math{a_i} é um
1109 inteiro não nulo, e (2) @math{a_1 + ... + a_m = n.} Dessa forma, 0
1115 @c integer_partitions (3);
1116 @c s: integer_partitions (25)$
1118 @c map (lambda ([x], apply ("+", x)), s);
1119 @c integer_partitions (5, 3);
1120 @c integer_partitions (5, 2);
1123 (%i1) integer_partitions (3);
1124 (%o1) @{[1, 1, 1], [2, 1], [3]@}
1125 (%i2) s: integer_partitions (25)$
1126 (%i3) cardinality (s);
1128 (%i4) map (lambda ([x], apply ("+", x)), s);
1130 (%i5) integer_partitions (5, 3);
1131 (%o5) @{[2, 2, 1], [3, 1, 1], [3, 2, 0], [4, 1, 0], [5, 0, 0]@}
1132 (%i6) integer_partitions (5, 2);
1133 (%o6) @{[3, 2], [4, 1], [5, 0]@}
1136 Para encontrar todas as partições que satisfazem uma
1137 condição, use a função @code{subset};
1138 aqui está um exemplo que encontra todas as partições
1139 de 10 cujos elementos da lista são números primos.
1142 @c s: integer_partitions (10)$
1144 @c xprimep(x) := integerp(x) and (x > 1) and primep(x)$
1145 @c subset (s, lambda ([x], every (xprimep, x)));
1148 (%i1) s: integer_partitions (10)$
1149 (%i2) cardinality (s);
1151 (%i3) xprimep(x) := integerp(x) and (x > 1) and primep(x)$
1152 (%i4) subset (s, lambda ([x], every (xprimep, x)));
1153 (%o4) @{[2, 2, 2, 2, 2], [3, 3, 2, 2], [5, 3, 2], [5, 5], [7, 3]@}
1159 @deffn {Função} intersect (@var{a_1}, ..., @var{a_n})
1161 @code{intersect} é o mesmo que @code{intersection}, como veremos.
1165 @anchor{intersection}
1166 @deffn {Função} intersection (@var{a_1}, ..., @var{a_n})
1167 Retorna um conjunto contendo os elementos que são comuns aos conjuntos
1168 @var{a_1} até @var{a_n}.
1170 @code{intersection} falha se qualquer dos argumentos não for um
1176 @c S_1 : {a, b, c, d};
1177 @c S_2 : {d, e, f, g};
1178 @c S_3 : {c, d, e, f};
1180 @c intersection (S_1, S_2);
1181 @c intersection (S_2, S_3);
1182 @c intersection (S_1, S_2, S_3);
1183 @c intersection (S_1, S_2, S_3, S_4);
1186 (%i1) S_1 : @{a, b, c, d@};
1187 (%o1) @{a, b, c, d@}
1188 (%i2) S_2 : @{d, e, f, g@};
1189 (%o2) @{d, e, f, g@}
1190 (%i3) S_3 : @{c, d, e, f@};
1191 (%o3) @{c, d, e, f@}
1192 (%i4) S_4 : @{u, v, w@};
1194 (%i5) intersection (S_1, S_2);
1196 (%i6) intersection (S_2, S_3);
1198 (%i7) intersection (S_1, S_2, S_3);
1200 (%i8) intersection (S_1, S_2, S_3, S_4);
1206 @deffn {Função} kron_delta (@var{x}, @var{y})
1208 Representa a função delta de Kronecker.
1210 @code{kron_delta} simplifica para 1 quando @var{x} e @var{y} forem
1211 idênticos ou equivalentes, e simplifica para 0 quando @var{x} e
1212 @var{y} não forem equivalentes. De outra forma, se não for certo que
1213 @var{x} e @var{y} são equivalentes, @code{kron_delta} simplificará
1214 para uma expressão substantiva. @code{kron_delta} implementa uma
1215 política de segurança para expressões em
1216 ponto flutuante: se a diferença @code{@var{x} - @var{y}}
1217 for um número em ponto flutuante, @code{kron_delta} simplifica para
1218 uma expressão substantiva quando @var{x} for aparentemente equivalente
1221 Especificamente, @code{kron_delta(@var{x}, @var{y})} simplifica para 1
1222 quando @code{is(x = y)} for @code{true}. @code{kron_delta} também
1223 simplifica para 1 quando @code{sign(abs(@var{x} - @var{y}))} for
1224 @code{zero} e @code{@var{x} - @var{y}} não for um número em ponto
1225 flutuante (e também não for um número de precisão simples em
1226 ponto flutuante nem um número de precisão dupla em poto flutuante,
1227 isto é, não for um bigfloat). @code{kron_delta} simplifica para 0
1228 quando @code{sign(abs(@var{x} - @var{y}))} for @code{pos}.
1230 Caso contrário, @code{sign(abs(@var{x} - @var{y}))} é diferente de
1231 @code{pos} ou @code{zero}, ou é @code{zero} e @code{@var{x} - @var{y}}
1232 é um número em ponto flutuante. Nesses casos, @code{kron_delta}
1233 retorna um expressão substantiva.
1235 @code{kron_delta} é declarada como sendo simétrica. Isto é,
1236 @code{kron_delta(@var{x}, @var{y})} é igual a
1237 @code{kron_delta(@var{y}, @var{x})}.
1241 Os argumentos de @code{kron_delta} são idênticos. @code{kron_delta}
1245 @c kron_delta (a, a);
1246 @c kron_delta (x^2 - y^2, x^2 - y^2);
1247 @c float (kron_delta (1/10, 0.1));
1250 (%i1) kron_delta (a, a);
1252 (%i2) kron_delta (x^2 - y^2, x^2 - y^2);
1254 (%i3) float (kron_delta (1/10, 0.1));
1258 Os argumentos de @code{kron_delta} são equivalentes, e a
1259 diferença entre eles não é um número em ponto
1260 flutuante. @code{kron_delta} simplifica para 1.
1263 @c assume (equal (x, y));
1264 @c kron_delta (x, y);
1267 (%i1) assume (equal (x, y));
1269 (%i2) kron_delta (x, y);
1273 Os argumentos de @code{kron_delta} não são equivalentes.
1274 @code{kron_delta} simplifica para 0.
1277 @c kron_delta (a + 1, a);
1279 @c kron_delta (a, b);
1280 @c kron_delta (1/5, 0.7);
1283 (%i1) kron_delta (a + 1, a);
1285 (%i2) assume (a > b)$
1286 (%i3) kron_delta (a, b);
1288 (%i4) kron_delta (1/5, 0.7);
1292 Os argumentos de @code{kron_delta} podem ou não ser equivalentes.
1293 @code{kron_delta} simplifica para uma expressão substantiva.
1296 @c kron_delta (a, b);
1298 @c kron_delta (x, y);
1301 (%i1) kron_delta (a, b);
1302 (%o1) kron_delta(a, b)
1303 (%i2) assume(x >= y)$
1304 (%i3) kron_delta (x, y);
1305 (%o3) kron_delta(x, y)
1308 Os argumentos de @code{kron_delta} são equivalentes, mas a
1309 diferença entre eles é um número em ponto flutuante.
1310 @code{kron_delta} simplifica para uma expressão substantiva.
1316 @c kron_delta (1/4, 0.25);
1317 @c kron_delta (1/10, 0.1);
1318 @c kron_delta (0.25, 0.25b0);
1325 (%i3) 0.25 - 0.25b0;
1326 Warning: Float to bigfloat conversion of 0.25
1328 (%i4) kron_delta (1/4, 0.25);
1330 (%o4) kron_delta(-, 0.25)
1332 (%i5) kron_delta (1/10, 0.1);
1334 (%o5) kron_delta(--, 0.1)
1336 (%i6) kron_delta (0.25, 0.25b0);
1337 Warning: Float to bigfloat conversion of 0.25
1338 (%o6) kron_delta(0.25, 2.5b-1)
1341 @code{kron_delta} é simétrica.
1344 @c kron_delta (x, y);
1345 @c kron_delta (y, x);
1346 @c kron_delta (x, y) - kron_delta (y, x);
1347 @c is (equal (kron_delta (x, y), kron_delta (y, x)));
1348 @c is (kron_delta (x, y) = kron_delta (y, x));
1351 (%i1) kron_delta (x, y);
1352 (%o1) kron_delta(x, y)
1353 (%i2) kron_delta (y, x);
1354 (%o2) kron_delta(x, y)
1355 (%i3) kron_delta (x, y) - kron_delta (y, x);
1357 (%i4) is (equal (kron_delta (x, y), kron_delta (y, x)));
1359 (%i5) is (kron_delta (x, y) = kron_delta (y, x));
1366 @deffn {Função} listify (@var{a})
1368 Retorna uma lista contendo os elementos de @var{a} quando @var{a} for um
1369 conjunto. De outra forma, @code{listify} retorna @var{a}.
1371 @code{full_listify} substitui todos os operadores de conjunto em @var{a}
1372 por operadores de lista.
1377 @c listify ({a, b, c, d});
1378 @c listify (F ({a, b, c, d}));
1381 (%i1) listify (@{a, b, c, d@});
1383 (%i2) listify (F (@{a, b, c, d@}));
1384 (%o2) F(@{a, b, c, d@})
1390 @deffn {Função} lreduce (@var{F}, @var{s})
1391 @deffnx {Função} lreduce (@var{F}, @var{s}, @var{s_0})
1393 Extende a função de dois argumentos @var{F} para uma
1394 função de @code{n} argumentos, usando
1395 composição, onde @var{s} é uma lista.
1397 @code{lreduce(@var{F}, @var{s})} retorna @code{F(... F(F(s_1, s_2),
1398 s_3), ... s_n)}. Quando o argumento opcional @var{s_0} estiver
1399 presente, o resultado é equivalente a @code{lreduce(@var{F},
1400 cons(@var{s_0}, @var{s}))}.
1402 A função @var{F} é aplicada primeiro aos elementos
1403 mais à @emph{esquerda} de lista; daí o nome "lreduce".
1405 Veja também @code{rreduce}, @code{xreduce}, e @code{tree_reduce}.
1409 @code{lreduce} sem o argumento opcional.
1412 @c lreduce (f, [1, 2, 3]);
1413 @c lreduce (f, [1, 2, 3, 4]);
1416 (%i1) lreduce (f, [1, 2, 3]);
1418 (%i2) lreduce (f, [1, 2, 3, 4]);
1419 (%o2) f(f(f(1, 2), 3), 4)
1422 @code{lreduce} com o argumento opcional.
1425 @c lreduce (f, [1, 2, 3], 4);
1428 (%i1) lreduce (f, [1, 2, 3], 4);
1429 (%o1) f(f(f(4, 1), 2), 3)
1432 @code{lreduce} aplicada a operadores binários internos do Maxima
1433 @code{/} é o operador de divisão.
1436 @c lreduce ("^", args ({a, b, c, d}));
1437 @c lreduce ("/", args ({a, b, c, d}));
1440 (%i1) lreduce ("^", args (@{a, b, c, d@}));
1443 (%i2) lreduce ("/", args (@{a, b, c, d@}));
1452 @deffn {Função} makeset (@var{expr}, @var{x}, @var{s})
1454 Retorna um conjunto com elementos gerados a partir da expressão
1455 @var{expr}, onde @var{x} é uma lista de variáveis em @var{expr}, e
1456 @var{s}é um conjunto ou lista de listas. Para gerar cada elemento do
1457 conjunto, @var{expr} é avaliada com as variáveis @var{x}
1458 substituídas, em paralelo, por elementos de @var{s}.
1460 Cada elemento de @var{s} deve ter o mesmo comprimento que @var{x}. A
1461 lista de variáveis @var{x} deve ser uma lista de
1462 símbolos, sem índices. Mesmo se existir
1463 somente um símbolo, @var{x} deve ser uma lista de um
1464 elemento, e cada elemento de @var{s} deve ser uma lista de um elemento.
1466 @c FOLLOWING EQUIVALENT EXPRESSION IS REALLY TOO COMPLICATED, JUST SKIP IT FOR NOW
1467 @c @code{makeset(@var{expr}, @var{x}, @var{s})} returns the same result as
1468 @c @code{setify(map(lambda([L], sublis(map("=", ''@var{x}, L), ''@var{expr})), args(@var{s})))}.
1470 Veja também @code{makelist}.
1475 @c makeset (i/j, [i, j], [[1, a], [2, b], [3, c], [4, d]]);
1477 @c S3 : cartesian_product (S, S, S);
1478 @c makeset (i + j + k, [i, j, k], S3);
1479 @c makeset (sin(x), [x], {[1], [2], [3]});
1482 (%i1) makeset (i/j, [i, j], [[1, a], [2, b], [3, c], [4, d]]);
1484 (%o1) @{-, -, -, -@}
1486 (%i2) S : @{x, y, z@}$
1487 (%i3) S3 : cartesian_product (S, S, S);
1488 (%o3) @{[x, x, x], [x, x, y], [x, x, z], [x, y, x], [x, y, y],
1489 [x, y, z], [x, z, x], [x, z, y], [x, z, z], [y, x, x],
1490 [y, x, y], [y, x, z], [y, y, x], [y, y, y], [y, y, z],
1491 [y, z, x], [y, z, y], [y, z, z], [z, x, x], [z, x, y],
1492 [z, x, z], [z, y, x], [z, y, y], [z, y, z], [z, z, x],
1493 [z, z, y], [z, z, z]@}
1494 (%i4) makeset (i + j + k, [i, j, k], S3);
1495 (%o4) @{3 x, 3 y, y + 2 x, 2 y + x, 3 z, z + 2 x, z + y + x,
1496 z + 2 y, 2 z + x, 2 z + y@}
1497 (%i5) makeset (sin(x), [x], @{[1], [2], [3]@});
1498 (%o5) @{sin(1), sin(2), sin(3)@}
1503 @deffn {Função} moebius (@var{n})
1505 Representa a função de Moebius.
1507 Quando @var{n} for o produto de @math{k} primos distintos,
1508 @code{moebius(@var{n})} simplifica para @math{(-1)^k}; quando
1509 @math{@var{n} = 1}, simplifica para 1; e simplifica para 0 para todos os
1510 outros inteiros positivos.
1512 @code{moebius}, aplicada a equações, listas, matrizes
1513 e conjuntos, é calculada em forma distributiva.
1519 @c moebius (2 * 3 * 5);
1520 @c moebius (11 * 17 * 29 * 31);
1523 @c moebius (n = 12);
1524 @c moebius ([11, 11 * 13, 11 * 13 * 15]);
1525 @c moebius (matrix ([11, 12], [13, 14]));
1526 @c moebius ({21, 22, 23, 24});
1531 (%i2) moebius (2 * 3 * 5);
1533 (%i3) moebius (11 * 17 * 29 * 31);
1535 (%i4) moebius (2^32);
1539 (%i6) moebius (n = 12);
1540 (%o6) moebius(n) = 0
1541 (%i7) moebius ([11, 11 * 13, 11 * 13 * 15]);
1543 (%i8) moebius (matrix ([11, 12], [13, 14]));
1547 (%i9) moebius (@{21, 22, 23, 24@});
1553 @anchor{multinomial_coeff}
1554 @deffn {Função} multinomial_coeff (@var{a_1}, ..., @var{a_n})
1555 @deffnx {Função} multinomial_coeff ()
1557 Calcula o coeficiente multinomial.
1559 Quando cada @var{a_k} for um inteiro não negativo, o coeficiente
1560 multinomial indica o número de formas possíveis de
1561 colocar @code{@var{a_1} + ... + @var{a_n}} objectos distintos em
1562 @math{n} caixas com @var{a_k} elementos na @math{k}'ésima caixa. Em
1563 geral, @code{multinomial_coeff (@var{a_1}, ..., @var{a_n})} calcula
1564 @code{(@var{a_1} + ... + @var{a_n})!/(@var{a_1}! ... @var{a_n}!)}.
1566 @code{multinomial_coeff()} (sem argumentos) produz 1.
1568 @code{minfactorial} poderá conseguir simplificar o valor calculado por
1569 @code{multinomial_coeff}.
1574 @c multinomial_coeff (1, 2, x);
1575 @c minfactorial (%);
1576 @c multinomial_coeff (-6, 2);
1577 @c minfactorial (%);
1580 (%i1) multinomial_coeff (1, 2, x);
1584 (%i2) minfactorial (%);
1585 (x + 1) (x + 2) (x + 3)
1586 (%o2) -----------------------
1588 (%i3) multinomial_coeff (-6, 2);
1592 (%i4) minfactorial (%);
1597 @anchor{num_distinct_partitions}
1598 @deffn {Função} num_distinct_partitions (@var{n})
1599 @deffnx {Função} num_distinct_partitions (@var{n}, list)
1601 Calcula o n;umero de partições de inteiros distintos de @var{n}
1602 quando @var{n} for um inteiro não negativo.
1603 De outra forma, @code{num_distinct_partitions} retorna uma expressão substantiva.
1605 @code{num_distinct_partitions(@var{n}, list)} retorna uma
1606 lista do número de partições distintas de 1, 2, 3, ..., @var{n}.
1608 Uma partição distinta de @var{n} é
1609 uma lista de inteiros positivos distintos @math{k_1}, ..., @math{k_m}
1610 tais que @math{@var{n} = k_1 + ... + k_m}.
1615 @c num_distinct_partitions (12);
1616 @c num_distinct_partitions (12, list);
1617 @c num_distinct_partitions (n);
1620 (%i1) num_distinct_partitions (12);
1622 (%i2) num_distinct_partitions (12, list);
1623 (%o2) [1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 10, 12, 15]
1624 (%i3) num_distinct_partitions (n);
1625 (%o3) num_distinct_partitions(n)
1630 @anchor{num_partitions}
1631 @deffn {Função} num_partitions (@var{n})
1632 @deffnx {Função} num_partitions (@var{n}, list)
1634 Calcula o número das partições inteiras de @var{n}
1635 quando @var{n} for um inteiro não negativo. De outra forma,
1636 @code{num_partitions} retorna uma expressão substantiva.
1638 @code{num_partitions(@var{n}, list)} retorna uma
1639 lista do número de partições inteiras de 1, 2, 3, ..., @var{n}.
1641 Para um inteiro não negativo @var{n}, @code{num_partitions(@var{n})} é igual a
1642 @code{cardinality(integer_partitions(@var{n}))}; todavia, @code{num_partitions}
1643 não constrói actualmente o conjunto das partições, nesse sentido @code{num_partitions} é mais rápida.
1648 @c num_partitions (5) = cardinality (integer_partitions (5));
1649 @c num_partitions (8, list);
1650 @c num_partitions (n);
1653 (%i1) num_partitions (5) = cardinality (integer_partitions (5));
1655 (%i2) num_partitions (8, list);
1656 (%o2) [1, 1, 2, 3, 5, 7, 11, 15, 22]
1657 (%i3) num_partitions (n);
1658 (%o3) num_partitions(n)
1665 @anchor{partition_set}
1666 @deffn {Função} partition_set (@var{a}, @var{f})
1668 Partições do conjunto @var{a} que satisfazem o predicado @var{f}.
1670 @code{partition_set} retorna uma lista de dois conjuntos.
1671 O primeiro conjunto compreende os elementos de @var{a} para os quais @var{f} avalia para @code{false},
1672 e o segundo conjunto compreende quaisquer outros elementos de @var{a}.
1673 @code{partition_set} não aplica @code{is} ao valor de retorno de @var{f}.
1675 @code{partition_set} reclama se @var{a} não for um conjunto literal.
1677 Veja também @code{subset}.
1682 @c partition_set ({2, 7, 1, 8, 2, 8}, evenp);
1683 @c partition_set ({x, rat(y), rat(y) + z, 1}, lambda ([x], ratp(x)));
1686 (%i1) partition_set (@{2, 7, 1, 8, 2, 8@}, evenp);
1687 (%o1) [@{1, 7@}, @{2, 8@}]
1688 (%i2) partition_set (@{x, rat(y), rat(y) + z, 1@}, lambda ([x], ratp(x)));
1689 (%o2)/R/ [@{1, x@}, @{y, y + z@}]
1693 @anchor{permutations}
1694 @deffn {Função} permutations (@var{a})
1696 Retorna um conjunto todas as permutações distintas dos elementos da
1697 lista ou do conjunto @var{a}. Cada permutação é uma lista, não um conjunto.
1699 Quando @var{a} for uma lista, elementos duplicados de @var{a} são incluídos
1702 @code{permutations} reclama se @var{a} não for um conjunto literal ou uma lista literal.
1707 @c permutations ([a, a]);
1708 @c permutations ([a, a, b]);
1711 (%i1) permutations ([a, a]);
1713 (%i2) permutations ([a, a, b]);
1714 (%o2) @{[a, a, b], [a, b, a], [b, a, a]@}
1720 @deffn {Função} powerset (@var{a})
1721 @deffnx {Função} powerset (@var{a}, @var{n})
1723 Retorna o conjunto de todos os dubconjuntos de @var{a}, ou um subconjunto de @var{a}.
1725 @code{powerset(@var{a})} retorna o conjunto de todos os subconjuntos do conjunto @var{a}.
1726 @code{powerset(@var{a})} tem @code{2^cardinality(@var{a})} elementos.
1728 @code{powerset(@var{a}, @var{n})} retorna o conjunto de todos os subconjuntos de @var{a} que possuem
1729 cardinalidade @var{n}.
1731 @code{powerset} reclama se @var{a} não for um conjunto literal,
1732 ou se @var{n} não for um inteiro não negativo.
1737 @c powerset ({a, b, c});
1738 @c powerset ({w, x, y, z}, 4);
1739 @c powerset ({w, x, y, z}, 3);
1740 @c powerset ({w, x, y, z}, 2);
1741 @c powerset ({w, x, y, z}, 1);
1742 @c powerset ({w, x, y, z}, 0);
1745 (%i1) powerset (@{a, b, c@});
1746 (%o1) @{@{@}, @{a@}, @{a, b@}, @{a, b, c@}, @{a, c@}, @{b@}, @{b, c@}, @{c@}@}
1747 (%i2) powerset (@{w, x, y, z@}, 4);
1748 (%o2) @{@{w, x, y, z@}@}
1749 (%i3) powerset (@{w, x, y, z@}, 3);
1750 (%o3) @{@{w, x, y@}, @{w, x, z@}, @{w, y, z@}, @{x, y, z@}@}
1751 (%i4) powerset (@{w, x, y, z@}, 2);
1752 (%o4) @{@{w, x@}, @{w, y@}, @{w, z@}, @{x, y@}, @{x, z@}, @{y, z@}@}
1753 (%i5) powerset (@{w, x, y, z@}, 1);
1754 (%o5) @{@{w@}, @{x@}, @{y@}, @{z@}@}
1755 (%i6) powerset (@{w, x, y, z@}, 0);
1762 @deffn {Função} rreduce (@var{F}, @var{s})
1763 @deffnx {Função} rreduce (@var{F}, @var{s}, @var{s_@{n + 1@}})
1765 Extende a função de dois argumentos @var{F} para uma função de @var{n} argumentos usando composição de funções,
1766 onde @var{s} é uma lista.
1768 @code{rreduce(@var{F}, @var{s})} retorna @code{F(s_1, ... F(s_@{n - 2@}, F(s_@{n - 1@}, s_n)))}.
1769 Quando o argumento opcional @var{s_@{n + 1@}} estiver presente,
1770 o resultado é equivalente a @code{rreduce(@var{F}, endcons(@var{s_@{n + 1@}}, @var{s}))}.
1772 A função @var{F} é primeiro aplicada à
1773 lista de elementos @i{mais à direita - rightmost}, daí o nome "rreduce".
1775 Veja também @code{lreduce}, @code{tree_reduce}, e @code{xreduce}.
1779 @code{rreduce} sem o argumento opcional.
1782 @c rreduce (f, [1, 2, 3]);
1783 @c rreduce (f, [1, 2, 3, 4]);
1786 (%i1) rreduce (f, [1, 2, 3]);
1788 (%i2) rreduce (f, [1, 2, 3, 4]);
1789 (%o2) f(1, f(2, f(3, 4)))
1792 @code{rreduce} com o argumento opcional.
1795 @c rreduce (f, [1, 2, 3], 4);
1798 (%i1) rreduce (f, [1, 2, 3], 4);
1799 (%o1) f(1, f(2, f(3, 4)))
1802 @code{rreduce} aplicada a operadores de dois argumentos internos ( definidos por padrão) ao Maxima.
1803 @code{/} é o operadro de divisão.
1806 @c rreduce ("^", args ({a, b, c, d}));
1807 @c rreduce ("/", args ({a, b, c, d}));
1810 (%i1) rreduce ("^", args (@{a, b, c, d@}));
1815 (%i2) rreduce ("/", args (@{a, b, c, d@}));
1823 @anchor{setdifference}
1824 @deffn {Função} setdifference (@var{a}, @var{b})
1826 Retorna um conjunto contendo os elementos no conjunto @var{a} que
1827 não estãono conjunto @var{b}.
1829 @code{setdifference} reclama se ou @var{a} ou @var{b} não for um conjunto literal.
1834 @c S_1 : {a, b, c, x, y, z};
1835 @c S_2 : {aa, bb, c, x, y, zz};
1836 @c setdifference (S_1, S_2);
1837 @c setdifference (S_2, S_1);
1838 @c setdifference (S_1, S_1);
1839 @c setdifference (S_1, {});
1840 @c setdifference ({}, S_1);
1843 (%i1) S_1 : @{a, b, c, x, y, z@};
1844 (%o1) @{a, b, c, x, y, z@}
1845 (%i2) S_2 : @{aa, bb, c, x, y, zz@};
1846 (%o2) @{aa, bb, c, x, y, zz@}
1847 (%i3) setdifference (S_1, S_2);
1849 (%i4) setdifference (S_2, S_1);
1850 (%o4) @{aa, bb, zz@}
1851 (%i5) setdifference (S_1, S_1);
1853 (%i6) setdifference (S_1, @{@});
1854 (%o6) @{a, b, c, x, y, z@}
1855 (%i7) setdifference (@{@}, S_1);
1862 @deffn {Função} setequalp (@var{a}, @var{b})
1864 Retorna @code{true} se os conjuntos @var{a} e @var{b} possuirem o mesmo número de elementos
1865 @c $SETEQUALP CALLS THE LISP FUNCTION LIKE,
1866 @c AND SO DOES THE CODE TO EVALUATE IS (X = Y).
1867 e @code{is(@var{x} = @var{y})} for @code{true}
1868 para @code{x} nos elementos de @var{a}
1869 e @code{y} nos elementos de @var{b},
1870 considerados na ordem determinada por @code{listify}.
1871 De outra forma, @code{setequalp} retorna @code{false}.
1876 @c setequalp ({1, 2, 3}, {1, 2, 3});
1877 @c setequalp ({a, b, c}, {1, 2, 3});
1878 @c setequalp ({x^2 - y^2}, {(x + y) * (x - y)});
1881 (%i1) setequalp (@{1, 2, 3@}, @{1, 2, 3@});
1883 (%i2) setequalp (@{a, b, c@}, @{1, 2, 3@});
1885 (%i3) setequalp (@{x^2 - y^2@}, @{(x + y) * (x - y)@});
1892 @deffn {Função} setify (@var{a})
1894 Constrói um conjunto de elementos a partir da lista @var{a}. Elementos
1895 duplicados da lista @var{a} são apagados e os elementos
1896 são ordenados de acordo com o predicado @code{orderlessp}.
1898 @code{setify} reclama se @var{a} não for uma lista literal.
1903 @c setify ([1, 2, 3, a, b, c]);
1904 @c setify ([a, b, c, a, b, c]);
1905 @c setify ([7, 13, 11, 1, 3, 9, 5]);
1908 (%i1) setify ([1, 2, 3, a, b, c]);
1909 (%o1) @{1, 2, 3, a, b, c@}
1910 (%i2) setify ([a, b, c, a, b, c]);
1912 (%i3) setify ([7, 13, 11, 1, 3, 9, 5]);
1913 (%o3) @{1, 3, 5, 7, 9, 11, 13@}
1919 @deffn {Função} setp (@var{a})
1921 Retorna @code{true} se e somente se @var{a} for um conjunto na interpretação do Maxima.
1923 @code{setp} retorna @code{true} para conjuntos não simplificados (isto é, conjuntos com elementos redundantes)
1924 e também para conjuntos simplificados.
1926 @c NOT SURE WE NEED TO MENTION THIS. OK FOR NOW
1927 @code{setp} é equivalente à função do Maxima
1928 @code{setp(a) := not atom(a) and op(a) = 'set}.
1948 @anchor{set_partitions}
1949 @deffn {Função} set_partitions (@var{a})
1950 @deffnx {Função} set_partitions (@var{a}, @var{n})
1952 Retorna o conjunto de todas as partições de @var{a}, ou um subconjunto daquele conjunto de partições.
1954 @code{set_partitions(@var{a}, @var{n})} retorna um conjunto de todas as
1955 decomposições de @var{a} em @var{n} subconjutnos disjuntos não vazios.
1957 @code{set_partitions(@var{a})} retorna o conjunto de todas as partições.
1959 @code{stirling2} retorna a cardinalidade de um conjuntode partições de um conjunto.
1961 Um conjunto de conjuntos @math{P} é uma partição de um conjunto @math{S} quando
1965 cada elemento de @math{P} é um conjunto não vazio,
1967 elementos distintos de @math{P} são disjuntos,
1969 a união dos elementos de @math{P} é igual a @math{S}.
1974 O conjunto vazio é uma partição de si mesmo, as ondições 1 e 2 são "vaziamente" verdadeiras.
1977 @c set_partitions ({});
1980 (%i1) set_partitions (@{@});
1984 A cardinalidade do conjunto de partições de um conjunto pode ser encontrada usando @code{stirling2}.
1987 @c s: {0, 1, 2, 3, 4, 5}$
1988 @c p: set_partitions (s, 3)$
1989 @c cardinality(p) = stirling2 (6, 3);
1992 (%i1) s: @{0, 1, 2, 3, 4, 5@}$
1993 (%i2) p: set_partitions (s, 3)$
1994 (%i3) cardinality(p) = stirling2 (6, 3);
1998 Cada elemento de @code{p} pode ter @var{n} = 3 elementos; vamos verificar.
2001 @c s: {0, 1, 2, 3, 4, 5}$
2002 @c p: set_partitions (s, 3)$
2003 @c map (cardinality, p);
2006 (%i1) s: @{0, 1, 2, 3, 4, 5@}$
2007 (%i2) p: set_partitions (s, 3)$
2008 (%i3) map (cardinality, p);
2012 Finalmente, para cada elementos de @code{p}, a união de seus elementos possivelmente será
2013 igua a @code{s}; novamente vamos comprovar.
2016 @c s: {0, 1, 2, 3, 4, 5}$
2017 @c p: set_partitions (s, 3)$
2018 @c map (lambda ([x], apply (union, listify (x))), p);
2021 (%i1) s: @{0, 1, 2, 3, 4, 5@}$
2022 (%i2) p: set_partitions (s, 3)$
2023 (%i3) map (lambda ([x], apply (union, listify (x))), p);
2024 (%o3) @{@{0, 1, 2, 3, 4, 5@}@}
2029 @deffn {Função} some (@var{f}, @var{a})
2030 @deffnx {Função} some (@var{f}, @var{L_1}, ..., @var{L_n})
2032 Retorna @code{true} se o predicado @var{f} for @code{true} para um ou mais argumentos dados.
2034 Given one set as the second argument,
2035 @code{some(@var{f}, @var{s})} returns @code{true}
2036 if @code{is(@var{f}(@var{a_i}))} returns @code{true} for one or more @var{a_i} in @var{s}.
2037 @code{some} may or may not evaluate @var{f} for all @var{a_i} in @var{s}.
2038 Since sets are unordered,
2039 @code{some} may evaluate @code{@var{f}(@var{a_i})} in any order.
2041 Dadas uma ou mais listas como argumentos,
2042 @code{some(@var{f}, @var{L_1}, ..., @var{L_n})} retorna @code{true}
2043 se @code{is(@var{f}(@var{x_1}, ..., @var{x_n}))} retornar @code{true}
2044 para um ou mais @var{x_1}, ..., @var{x_n} em @var{L_1}, ..., @var{L_n}, respectivamente.
2045 @code{some} pode ou não avaliar
2046 @var{f} para algumas combinações @var{x_1}, ..., @var{x_n}.
2047 @code{some} avalia listas na ordem do índice de incremento.
2049 Dado um conjunto vazio @code{@{@}} ou uma lista vazia @code{[]} como argumentos,
2050 @code{some} retorna @code{false}.
2052 Quando o sinalizador global @code{maperror} for @code{true}, todas as listas
2053 @var{L_1}, ..., @var{L_n} devem ter obrigatóriamente comprimentos iguais.
2054 Quando @code{maperror} for @code{false}, argumentos do tipo lista são
2055 efectivamente truncados para o comprimento da menor lista.
2057 Retorna o valor de um predicado @var{f} o qual avalia (por meio de @code{is})
2058 para alguma coisa outra que não @code{true} ou @code{false}
2059 e são governados pelo sinalizador global @code{prederror}.
2060 Quando @code{prederror} for @code{true},
2061 tais valores são tratados como @code{false}.
2062 Quando @code{prederror} for @code{false},
2063 tais valores são tratados como @code{unknown} (desconhecidos).
2067 @code{some} aplicado a um conjunto simples.
2068 O predicado é uma função de um argumento.
2071 @c some (integerp, {1, 2, 3, 4, 5, 6});
2072 @c some (atom, {1, 2, sin(3), 4, 5 + y, 6});
2075 (%i1) some (integerp, @{1, 2, 3, 4, 5, 6@});
2077 (%i2) some (atom, @{1, 2, sin(3), 4, 5 + y, 6@});
2081 @code{some} aplicada a duas listas.
2082 O predicado é uma função de dois argumentos.
2085 @c some ("=", [a, b, c], [a, b, c]);
2086 @c some ("#", [a, b, c], [a, b, c]);
2089 (%i1) some ("=", [a, b, c], [a, b, c]);
2091 (%i2) some ("#", [a, b, c], [a, b, c]);
2095 Retorna o valor do predicado @var{f} o qual avalia
2096 para alguma coisa que não @code{true} ou @code{false}
2097 e são governados através do sinalizador global @code{prederror}.
2100 @c prederror : false;
2101 @c map (lambda ([a, b], is (a < b)), [x, y, z], [x^2, y^2, z^2]);
2102 @c some ("<", [x, y, z], [x^2, y^2, z^2]);
2103 @c some ("<", [x, y, z], [x^2, y^2, z + 1]);
2104 @c prederror : true;
2105 @c some ("<", [x, y, z], [x^2, y^2, z^2]);
2106 @c some ("<", [x, y, z], [x^2, y^2, z + 1]);
2109 (%i1) prederror : false;
2111 (%i2) map (lambda ([a, b], is (a < b)), [x, y, z], [x^2, y^2, z^2]);
2112 (%o2) [unknown, unknown, unknown]
2113 (%i3) some ("<", [x, y, z], [x^2, y^2, z^2]);
2115 (%i4) some ("<", [x, y, z], [x^2, y^2, z + 1]);
2117 (%i5) prederror : true;
2119 (%i6) some ("<", [x, y, z], [x^2, y^2, z^2]);
2121 (%i7) some ("<", [x, y, z], [x^2, y^2, z + 1]);
2127 @deffn {Função} stirling1 (@var{n}, @var{m})
2129 Representa o número de Stirling de primeiro tipo.
2131 Quando @var{n} e @var{m} forem não negativos
2132 inteiros, a magnitude de @code{stirling1 (@var{n}, @var{m})} é o número de
2133 permutações de um conjunto com @var{n} elementos que possui @var{m} ciclos.
2134 Para detalhes, veja Graham, Knuth e Patashnik @i{Concrete Mathematics}.
2135 Maxima utiliza uma relação recursiva para definir @code{stirling1 (@var{n}, @var{m})} para
2136 @var{m} menor que 0; @code{stirling1} não é definida para @var{n} menor que 0 e para argumentos
2139 @code{stirling1} é uma função de simplificação.
2140 Maxima conhece as seguintes identidades:
2142 @c COPIED VERBATIM FROM SRC/NSET.LISP
2145 @math{stirling1(0, n) = kron_delta(0, n)} (Ref. [1])
2147 @math{stirling1(n, n) = 1} (Ref. [1])
2149 @math{stirling1(n, n - 1) = binomial(n, 2)} (Ref. [1])
2151 @math{stirling1(n + 1, 0) = 0} (Ref. [1])
2153 @math{stirling1(n + 1, 1) = n!} (Ref. [1])
2155 @math{stirling1(n + 1, 2) = 2^n - 1} (Ref. [1])
2158 Essas identidades são aplicadas quando os argumentos forem inteiros literais
2159 ou símbolos declarados como inteiros, e o primeiro argumento for não negativo.
2160 @code{stirling1} não simplififca para argumentos não inteiros.
2164 [1] Donald Knuth, @i{The Art of Computer Programming,}
2165 terceira edição, Volume 1, Seção 1.2.6, Equações 48, 49, e 50.
2170 @c declare (n, integer)$
2172 @c stirling1 (n, n);
2175 (%i1) declare (n, integer)$
2176 (%i2) assume (n >= 0)$
2177 (%i3) stirling1 (n, n);
2181 @code{stirling1} não simplifica para argumentos não inteiros.
2184 @c stirling1 (sqrt(2), sqrt(2));
2187 (%i1) stirling1 (sqrt(2), sqrt(2));
2188 (%o1) stirling1(sqrt(2), sqrt(2))
2191 Maxima aplica identidades a @code{stirling1}.
2194 @c declare (n, integer)$
2196 @c stirling1 (n + 1, n);
2197 @c stirling1 (n + 1, 1);
2200 (%i1) declare (n, integer)$
2201 (%i2) assume (n >= 0)$
2202 (%i3) stirling1 (n + 1, n);
2206 (%i4) stirling1 (n + 1, 1);
2212 @deffn {Função} stirling2 (@var{n}, @var{m})
2214 Representa o número de Stirling de segundo tipo.
2216 Quando @var{n} e @var{m} forem inteiros
2217 não negativos, @code{stirling2 (@var{n}, @var{m})} é o número de maneiras através dos quais um conjunto com
2218 cardinalidade @var{n} pode ser particionado em @var{m} subconjuntos disjuntos.
2219 Maxima utiliza uma relação recursiva para definir @code{stirling2 (@var{n}, @var{m})} para
2220 @var{m} menor que 0; @code{stirling2} é indefinida para @var{n} menor que 0 e para argumentos
2223 @code{stirling2} é uma função de simplificação.
2224 Maxima conhece as seguintes identidades.
2226 @c COPIED VERBATIM FROM SRC/NSET.LISP
2229 @math{stirling2(0, n) = kron_delta(0, n)} (Ref. [1])
2231 @math{stirling2(n, n) = 1} (Ref. [1])
2233 @math{stirling2(n, n - 1) = binomial(n, 2)} (Ref. [1])
2235 @math{stirling2(n + 1, 1) = 1} (Ref. [1])
2237 @math{stirling2(n + 1, 2) = 2^n - 1} (Ref. [1])
2239 @math{stirling2(n, 0) = kron_delta(n, 0)} (Ref. [2])
2241 @math{stirling2(n, m) = 0} when @math{m > n} (Ref. [2])
2243 @math{stirling2(n, m) = sum((-1)^(m - k) binomial(m k) k^n,i,1,m) / m!}
2244 onde @math{m} e @math{n} são inteiros, e @math{n} é não negativo. (Ref. [3])
2247 Essas identidades são aplicadas quando os argumentos forem inteiros literais
2248 ou símbolos declarados como inteiros, e o primeiro argumento for não negativo.
2249 @code{stirling2} não simplifica para argumentos não inteiros.
2253 [1] Donald Knuth. @i{The Art of Computer Programming},
2254 terceira edição, Volume 1, Seção 1.2.6, Equações 48, 49, e 50.
2256 [2] Graham, Knuth, e Patashnik. @i{Concrete Mathematics}, Tabela 264.
2258 [3] Abramowitz e Stegun. @i{Handbook of Mathematical Functions}, Seção 24.1.4.
2263 @c declare (n, integer)$
2265 @c stirling2 (n, n);
2268 (%i1) declare (n, integer)$
2269 (%i2) assume (n >= 0)$
2270 (%i3) stirling2 (n, n);
2274 @code{stirling2} não simplifica para argumentos não inteiros.
2277 @c stirling2 (%pi, %pi);
2280 (%i1) stirling2 (%pi, %pi);
2281 (%o1) stirling2(%pi, %pi)
2284 Maxima aplica identidades a @code{stirling2}.
2287 @c declare (n, integer)$
2289 @c stirling2 (n + 9, n + 8);
2290 @c stirling2 (n + 1, 2);
2293 (%i1) declare (n, integer)$
2294 (%i2) assume (n >= 0)$
2295 (%i3) stirling2 (n + 9, n + 8);
2297 (%o3) ---------------
2299 (%i4) stirling2 (n + 1, 2);
2306 @deffn {Função} subset (@var{a}, @var{f})
2308 Retorna o subconjuntode um conjunto @var{a} que satisfaz o predicado @var{f}.
2310 @code{subset} returns um conjunto which comprises the elements of @var{a}
2311 for which @var{f} returns anything other than @code{false}.
2312 @code{subset} does not apply @code{is} to the return value of @var{f}.
2314 @code{subset} reclama se @var{a} não for um conjunto literal.
2316 See also @code{partition_set}.
2321 @c subset ({1, 2, x, x + y, z, x + y + z}, atom);
2322 @c subset ({1, 2, 7, 8, 9, 14}, evenp);
2325 (%i1) subset (@{1, 2, x, x + y, z, x + y + z@}, atom);
2326 (%o1) @{1, 2, x, z@}
2327 (%i2) subset (@{1, 2, 7, 8, 9, 14@}, evenp);
2334 @deffn {Função} subsetp (@var{a}, @var{b})
2336 Retorna @code{true} se e somente se o conjunto @var{a} for um subconjunto de @var{b}.
2338 @code{subsetp} reclama se ou @var{a} ou @var{b} não forem um conjunto literal.
2343 @c subsetp ({1, 2, 3}, {a, 1, b, 2, c, 3});
2344 @c subsetp ({a, 1, b, 2, c, 3}, {1, 2, 3});
2347 (%i1) subsetp (@{1, 2, 3@}, @{a, 1, b, 2, c, 3@});
2349 (%i2) subsetp (@{a, 1, b, 2, c, 3@}, @{1, 2, 3@});
2355 @anchor{symmdifference}
2356 @deffn {Função} symmdifference (@var{a_1}, ..., @var{a_n})
2358 Retorna a diferença simétrica, isto é,
2359 o conjunto dos elemetnos que ocorrem em exactamente um conjunto @var{a_k}.
2361 Given two arguments, @code{symmdifference(@var{a}, @var{b})} is
2362 the same as @code{union(setdifference(@var{a}, @var{b}), setdifference(@var{b}, @var{a}))}.
2364 @code{symmdifference} reclama se any argument não for um conjunto literal.
2372 @c symmdifference ();
2373 @c symmdifference (S_1);
2374 @c symmdifference (S_1, S_2);
2375 @c symmdifference (S_1, S_2, S_3);
2376 @c symmdifference ({}, S_1, S_2, S_3);
2379 (%i1) S_1 : @{a, b, c@};
2381 (%i2) S_2 : @{1, b, c@};
2383 (%i3) S_3 : @{a, b, z@};
2385 (%i4) symmdifference ();
2387 (%i5) symmdifference (S_1);
2389 (%i6) symmdifference (S_1, S_2);
2391 (%i7) symmdifference (S_1, S_2, S_3);
2393 (%i8) symmdifference (@{@}, S_1, S_2, S_3);
2399 @c TREE_REDUCE ACCEPTS A SET OR LIST AS AN ARGUMENT, BUT RREDUCE AND LREDUCE WANT ONLY LISTS; STRANGE
2400 @anchor{tree_reduce}
2401 @deffn {Função} tree_reduce (@var{F}, @var{s})
2402 @deffnx {Função} tree_reduce (@var{F}, @var{s}, @var{s_0})
2404 Extende a função binária @var{F} a uma função enária através de composição,
2405 onde @var{s} é um conjunto ou uma lista.
2407 @code{tree_reduce} é equivalente ao seguinte:
2408 Aplicar @var{F} a sucessivos pares de elementos
2409 para formar uma nova lista @code{[@var{F}(@var{s_1}, @var{s_2}), @var{F}(@var{s_3}, @var{s_4}), ...]},
2410 mantendo o elemento final inalterado caso haja um número ímpar de elementos.
2411 Repetindo então o processo até que a lista esteja reduzida a um elemento simples, o qual é o valor de retorno da função.
2413 Quando o argumento opcional @var{s_0} estiver presente,
2414 o resultado é equivalente a @code{tree_reduce(@var{F}, cons(@var{s_0}, @var{s})}.
2416 Para adições em ponto flutuante,
2417 @code{tree_reduce} pode retornar uma soma que possui um menor ero de arredondamento
2418 que @code{rreduce} ou @code{lreduce}.
2420 Os elementos da lista @var{s} e os resultados parciais podem ser arranjados em uma árvore binária de profundidade mínima,
2421 daí o nome "tree_reduce".
2425 @code{tree_reduce} aplicada a uma lista com um número par de elementos.
2428 @c tree_reduce (f, [a, b, c, d]);
2431 (%i1) tree_reduce (f, [a, b, c, d]);
2432 (%o1) f(f(a, b), f(c, d))
2435 @code{tree_reduce} aplicada a uma lista com um número ímpar de elementos.
2438 @c tree_reduce (f, [a, b, c, d, e]);
2441 (%i1) tree_reduce (f, [a, b, c, d, e]);
2442 (%o1) f(f(f(a, b), f(c, d)), e)
2448 @deffn {Função} union (@var{a_1}, ..., @var{a_n})
2449 Retorna a união dos conjuntos de @var{a_1} a @var{a_n}.
2451 @code{union()} (sem argumentos) retorna o conjunto vazio.
2453 @code{union} reclama se qualquer argumento não for um conjunto literal.
2458 @c S_1 : {a, b, c + d, %e};
2459 @c S_2 : {%pi, %i, %e, c + d};
2460 @c S_3 : {17, 29, 1729, %pi, %i};
2463 @c union (S_1, S_2);
2464 @c union (S_1, S_2, S_3);
2465 @c union ({}, S_1, S_2, S_3);
2468 (%i1) S_1 : @{a, b, c + d, %e@};
2469 (%o1) @{%e, a, b, d + c@}
2470 (%i2) S_2 : @{%pi, %i, %e, c + d@};
2471 (%o2) @{%e, %i, %pi, d + c@}
2472 (%i3) S_3 : @{17, 29, 1729, %pi, %i@};
2473 (%o3) @{17, 29, 1729, %i, %pi@}
2477 (%o5) @{%e, a, b, d + c@}
2478 (%i6) union (S_1, S_2);
2479 (%o6) @{%e, %i, %pi, a, b, d + c@}
2480 (%i7) union (S_1, S_2, S_3);
2481 (%o7) @{17, 29, 1729, %e, %i, %pi, a, b, d + c@}
2482 (%i8) union (@{@}, S_1, S_2, S_3);
2483 (%o8) @{17, 29, 1729, %e, %i, %pi, a, b, d + c@}
2488 @c XREDUCE ACCEPTS A SET OR LIST AS AN ARGUMENT, BUT RREDUCE AND LREDUCE WANT ONLY LISTS; STRANGE
2490 @deffn {Função} xreduce (@var{F}, @var{s})
2491 @deffnx {Função} xreduce (@var{F}, @var{s}, @var{s_0})
2493 Extendendo a função @var{F} para uma função enária por composição,
2494 ou, se @var{F} já for enária, aplica-se @var{F} a @var{s}.
2495 Quando @var{F} não for enária, @code{xreduce} funciona da mesma forma que @code{lreduce}.
2496 O argumento @var{s} é uma lista.
2498 Funções sabidamente enárias inclui
2499 adição @code{+}, multiplicação @code{*}, @code{and}, @code{or}, @code{max},
2500 @code{min}, e @code{append}.
2501 Funções podem também serem declaradas enárias por meio de @code{declare(@var{F}, nary)}.
2503 é esperado que @code{xreduce} seja mais rápida que ou @code{rreduce} ou @code{lreduce}.
2505 Quando o argumento opcional @var{s_0} estiver presente,
2506 o resultado é equivalente a @code{xreduce(@var{s}, cons(@var{s_0}, @var{s}))}.
2508 @c NOT SURE WHAT IS THE RELEVANCE OF THE FOLLOWING COMMENT
2509 @c MAXIMA IS NEVER SO CAREFUL ABOUT FLOATING POINT ASSOCIATIVITY SO FAR AS I KNOW
2510 Adições em ponto flutuante não são exactamente associativas; quando a associatividade ocorrer,
2511 @code{xreduce} aplica a adição enária do Maxima quando @var{s} contiver números em ponto flutuante.
2515 @code{xreduce} aplicada a uma função sabidamente enária.
2516 @code{F} é chamada uma vez, com todos os argumentos.
2519 @c declare (F, nary);
2521 @c xreduce (F, [a, b, c, d, e]);
2524 (%i1) declare (F, nary);
2528 (%i3) xreduce (F, [a, b, c, d, e]);
2529 (%o3) [[[[[("[", simp), a], b], c], d], e]
2532 @code{xreduce} aplicada a uma função não sabidamente enária.
2533 @code{G} é chamada muitas vezes, com dois argumentos de cada vez.
2537 @c xreduce (G, [a, b, c, d, e]);
2538 @c lreduce (G, [a, b, c, d, e]);
2543 (%i2) xreduce (G, [a, b, c, d, e]);
2544 (%o2) [[[[[("[", simp), a], b], c], d], e]
2545 (%i3) lreduce (G, [a, b, c, d, e]);
2546 (%o3) [[[[a, b], c], d], e]