kill (all)$
done$

/* Test ability of parser to recognize curly braces notation on input.
 */

{};
set ();

{a, b, c};
set (a, b, c);

[{b, c}, {a}];
[set (b, c), set (a)];

[{a, b, c}, {}];
[set (a, b, c), set ()];

{{{{a, b, c}}}};
set (set (set (set (a, b, c))));

{a, b, 2^{c, d, e}, mogrify ({x, y, [{}]}, {[]})};
set (a, b, 2^set (c, d, e), mogrify (set (x, y, [set ()]), set ([])));

/* 1-d output should contain curly braces.
 */

string (set ());
"{}";

string (set (a, b, set (c, d, set (e))));
"{a,b,{c,d,{e}}}";

/* General tests.
 */

emptyp(set());
true$

emptyp([]);
true$

emptyp(set(false));
false$

emptyp([false]);
false$

emptyp(set(true));
false$

emptyp(set(set()));
false$

emptyp(set([]));
false$

emptyp(set(u,n,k));
false$

adjoin(set(),set());
set(set())$

adjoin(set(),set(a));
set(set(),a)$

adjoin(a,set());
set(a)$

adjoin(false,set());
set(false)$

adjoin(false,set(false));
set(false)$

adjoin(false,set(true));
set(true,false)$

adjoin(a, set(set()));
set(set(),a)$

adjoin(a,set(a));
set(a)$

adjoin(set(a),set(a));
set(a,set(a))$

adjoin(a,set(a,b));
set(a,b)$

adjoin(a,set(b,a));
set(a,b)$

adjoin(z,set(a,b));
set(a,b,z)$

errcatch(adjoin(a,b));
[]$

disjoin(x,set());
set()$

disjoin(x,set(x));
set()$

disjoin(x,set(y));
set(y)$

disjoin(0,set(0,1,2));
set(1,2)$

disjoin(1,set(0,1,2));
set(0,2)$

disjoin(2,set(0,1,2));
set(0,1)$

set(a,a,c);
set(a,c)$

set(a,c,a);
set(a,c)$

set(a,a,a);
set(a)$

set(set(a,b),set(a,b),z);
set(set(a,b),z)$

union();
set()$

union(set());
set()$

union(set(),set());
set()$

union(set(false),set());
set(false)$

union(set(6));
set(6)$

union(set(8,8,1932));
set(8,1932)$

union(set(a),set(a,b),set(a,b,c));
set(a,b,c)$

union(set(),set(a));
set(a)$

union(set(a),set(b),set(c));
set(a,b,c)$

union(set(set(a)),set(a))$
set(a,set(a))$

errcatch(union(set(a),set(b),x));
[]$

union(set(a),set());
set(a)$

union(set(),set(set()));
set(set())$

setdifference(set(a,b),set());
set(a,b)$

setdifference(set(a,b),set(a));
set(b)$

setdifference(set(a,b),set(b));
set(a)$

setdifference(set(a,b),set(x));
set(a,b)$

setdifference(set(a,b),set());
set(a,b)$

setdifference(set(),set(x));
set()$

setdifference(set(a),set(x));
set(a)$

setdifference(set(a,b),set(x));
set(a,b)$

errcatch(setdifference(a,b));
[]$

errcatch(setdifference(set(a),b));
[]$

errcatch(setdifference(a,set(b)));
[]$

errcatch(intersection());
[]$

intersection(set(x));
set(x)$

intersection(set(),set());
set()$

intersection(set(set()),set());
set()$

intersection(set(set()),set(set(),set(set())));
set(set())$

intersection(set(a,b),set(a,b,c));
set(a,b)$

intersection(set(a,b),set(x,y,z));
set()$

intersection(set(a,b,c),set(a,y,x),set(z,a),set(p,q,a));
set(a)$

errcatch(intersect());
[]$

intersect(set(x));
set(x)$

intersect(set(),set());
set()$

intersect(set(set()),set());
set()$

intersect(set(set()),set(set(),set(set())));
set(set())$

intersect(set(a,b),set(a,b,c));
set(a,b)$

intersect(set(a,b),set(x,y,z));
set()$

intersect(set(a,b,c),set(a,y,x),set(z,a),set(p,q,a));
set(a)$


subsetp(set(),set());
true$

subsetp(set(),set(a));
true$

subsetp(set(a),set())$
false$

subsetp(set(),set(set()));
true$

subsetp(set(set()),set(set()));
true$

subsetp(set(a,b),set(a,b,c));
true$

subsetp(set(a,b,c),set(a,b));
false$

errcatch(subsetp(a,b));
[]$

errcatch(subsetp(a,set(b)));
[]$

errcatch(subsetp(set(a),b));
[]$

disjointp(set(),set());
true$

disjointp(set(set()),set());
true$

errcatch(disjointp(a,a+b));
[]$

errcatch(disjointp(set(a),a+b));
[]$

errcatch(disjointp(a,set(a+b)));
[]$

disjointp(set(a),set(b));
true$

disjointp(set(b,a),set(a));
false$

subset(set(),evenp);
set()$

subset(set(3,5,8),evenp);
set(8)$

errcatch(subset(a,oddp));
[]$

subset(set(a,b,4,sin(x)), evenp);
set(4)$

symmdifference();
set()$

symmdifference(set());
set()$

symmdifference(set(1));
set(1)$

symmdifference(set(1,2,3));
set(1,2,3)$

symmdifference(set(a),set(b),set(c));
set(a,b,c)$

symmdifference(set(a),set(a,b),set(a,b,c));
set(a,c)$

symmdifference(set(a,b,c),set(a,b),set(a));
set(a,c)$

symmdifference(set(a,b,c),set(),set(1,2,3));
set(a,b,c,1,2,3)$

symmdifference(set(), set(1,2,3),set(a,b,c));
set(a,b,c,1,2,3)$

symmdifference(set(1,2,3),set(a,b,c),set());
set(a,b,c,1,2,3)$

symmdifference(set(), set(1,2,3),set(a,b,c),set(),set());
set(a,b,c,1,2,3)$

symmdifference(set(),set());
set()$

symmdifference(set(set()),set());
set(set())$

symmdifference(set(i,s,t,j), set(i,n,t,p));
set(s,n,j,p)$

errcatch(symmdifference(a,set(b)));
[]$

errcatch(symmdifference(set(a),b));
[]$

errcatch(symmdifference(a,set(b)));
[]$

symmdifference(set(a,b),set(a));
set(b)$


subsetp(set(),set());
true$

subsetp(set(set()),set());
false$

subsetp(set(),set(set()));
true$

subsetp(set(x),set(set(x)));
false$

subsetp(set(a,b),set(a,y));
false$

subsetp(set(a,b),set(a,b));
true$

subsetp(set(set(a)),set(x,y,set(a)));
true$

subsetp(set(rat(x)),set(x));
true$

subsetp(set(a,a,a,x),set(a,x));
true$

adjoin(x,set());
set(x)$


set(x,rat(x),x,x,x);
set(x)$

union(set(),set());
set()$

union(set(),set(8));
set(8)$

union(set(1932),set());
set(1932)$

union(set(set(8)),set(8));
set(set(8),8)$

is(union(set(a),set(b),set(c))= set(a,b,c));
true$

is(union(set(set()),set(b),set()) = set(b,set()));
true$

is(union(set(x=6),set(y=3),set(z=-8)) = set(z=-8,y=3,x=6));
true$

setify([]);
set()$

setify([a,b]);
set(a,b)$

setify([[a]]);
set([a])$

setify([set(a)]);
set(set(a))$

setify([false]);
set(false)$

setify([false,false]);
set(false)$

setify([false,false,true]);
set(true,false)$

listify(set());
[]$

listify(set(a));
[a]$

listify(set(set(a)));
[set(a)]$

listify(set(set()));
[set()]$

full_listify(set());
[]$

full_listify(set(false));
[false]$

full_listify(set(set));
[set]$

full_listify(set(x));
[x]$

full_listify(set(set()));
[[]]$

full_listify(set(set(false)));
[[false]]$

full_listify(set(a,set(b),set(set(c))));
[a,[b],[[c]]]$

full_listify(a+b=c);
a+b=c$

full_listify(matrix([1,2],[3,4]));
matrix([1,2],[3,4])$

full_listify(f(set(a)));
f([a])$

full_listify(f(set(set(a))));
f([[a]])$

full_listify(f(a,set(a), [a+b]));
f(a,[a],[a+b])$

full_listify(5);
5$

full_listify(a);
a$

full_listify(a[5]);
a[5]$

full_listify(sin(x+7));
sin(x+7)$

full_listify(7.8e-4);
7.8e-4$

full_listify(5.6b2);
5.6b2$

full_listify(set + 7);
set + 7$

full_listify(a^b + 1/set + set^z);
a^b + 1/set + set^z$

(simp : false,0);
0$

listify(set());
[]$

listify(set(a,a,b));
[a,a,b]$

full_listify(set(a,a,b));
[a,a,b]$

full_listify(set(a,a,b,set()));
[a,a,b,[]]$

(simp : true,0);
0$

subst(b=a,set(a,b));
set(a)$

subst(b=a,set());
set()$

subst([a=x,b=x,c=x],set(a,b,c));
set(x)$

union(set(x),set(y));
set(x,y)$

union(set(),set());
set();

errcatch(intersect());
[]$

intersect(set(a));
set(a)$

intersect(set(a),set(a,b));
set(a)$

elementp(x,set());
false$

elementp(false, set());
false$

elementp(false, set(false));
true$

elementp(set(),set());
false$

elementp(set(),set(set()));
true$

elementp(x,set(x));
true$

elementp(rat(x),set(x));
true$

elementp(x,set([x]));
false$

union(set(false),set(true));
set(false,true)$

union(setify([true,false]), set(x));
set(x,true,false)$

fullsetify([]);
set()$

fullsetify([false]);
set(false)$

fullsetify([[]]);
set(set())$

fullsetify([a,b,c]);
set(a,b,c)$

fullsetify([a,[b]]);
set(a,set(b))$

fullsetify(f[0,1]);
f[0,1]$

fullsetify(f[5](x));
f[5](x)$

fullsetify(matrix([1,2],[3,4]));
matrix([1,2],[3,4])$

(remfunction(f,g),0);
0$

flatten(3);
3$

flatten(-3);
-3$

flatten(2/3);
2/3$

flatten(-2/3);
-2/3$

flatten(1.4d2);
1.4d2$

flatten(-3.4d0);
-3.4d0$

flatten(x);
x$

flatten(abc);
abc$

flatten(%pi);
%pi$

flatten(rat(x));
''(rat(x))$

flatten(rat(-x));
''(rat(-x))$


flatten(x[5]);
x[5]$

flatten(x[8,32]);
x[8,32]$

flatten(-x);
-x$

flatten(rat(-x));
''(rat(-x))$

flatten(a+b);
a+b$

flatten(rat(a+b));
''(rat(a+b))$


flatten(a*b);
a*b$

flatten([]);
[]$

flatten([[]]);
[]$

flatten([x]);
[x]$

flatten([[x]]);
[x]$

flatten(f(g(f(f(x)))));
f(g(f(f(x))))$

flatten(f(f(g(f(x)))));
f(g(f(x)))$

/* Examples from Macsyma 422 */

flatten([a,b,[c,[d]],e,[[f],g,h]]);
[a,b,c,d,e,f,g,h]$

flatten([a,b([c]),[d]]);
[a,b([c]),d]$

flatten(f(f(a,b), f(c,d)));
f(a,b,c,d)$

flatten(f[1](f[1](a,b), f[1](c,d)));
f[1](a,b,c,d)$

elementp(false,set());
false$

elementp(false,set(1));
false$

elementp(false,set(false));
true$

elementp(0,set());
false$

elementp(1,set(1));
true$

elementp(0,set(1));
false$

elementp(2,set(1));
false$

elementp(1,set(0,2));
false$

adjoin(false,set());
set(false)$

adjoin(false,set(1));
set(false,1)$

adjoin(false,set(false));
set(false)$

adjoin(0,set());
set(0)$

adjoin(1,set(1));
set(1)$

adjoin(0,set(1));
set(1,0)$

adjoin(2,set(1));
set(2,1)$

adjoin(1,set(0,2));
set(0,1,2)$

cardinality(set());
0$

cardinality(set([]));
1$

cardinality(set(8,8,1932));
2$

errcatch(cardinality(x+y));
[]$

setp([]);
false$

setp(false);
false$

setp(true);
false$

setp(a+b);
false$

setp([x]);
false$

setp(set());
true$

setp(set(set(a+b=c)));
true$

setp(rat(x));
false$

setp(1.5b34);
false$

errcatch(setp());
[]$

listify(adjoin(-1,set(2,4,6)));
[-1,2,4,6]$

listify(adjoin(2,set(2,4,6)));
[2,4,6]$

listify(adjoin(3,set(2,4,6)));
[2,3,4,6]$

listify(adjoin(6,set(2,4,6)));
[2,4,6]$

listify(adjoin(7,set(2,4,6)));
[2,4,6,7]$

permutations(set());
set([])$

permutations([]);
set([])$

permutations([a]);
set([a])$

permutations([a,a]);
set([a,a])$

(s : listify(permutations([0,1,2,3,4])),0);
0$

is(s = sort(s));
true$

(s : listify(permutations([a,b,b,a])),0);
0$

is(s = sort(s));
true$

(q : [1,2,3,4,5],0);
0$

(s : permutations(q),0);
0$

is(cardinality(s) = length(q)!);
true$

elementp([5,3,2,1,4],s);
true$

elementp([5,3,2,1,0],s);
false$

(p : map(setify,s),0);
0$

is(p = set(setify(q)));
true$

(remvalue(s,p),0);
0$

powerset(set());
set(set())$

powerset(set(x));
set(set(),set(x))$

powerset(set(x,y));
set(set(),set(x),set(y),set(x,y))$

errcatch(powerset(a+b=c));
[]$

errcatch(powerset(rat(a)));
[]$

powerset(set(),0);
set(set())$

powerset(set(),1);
set()$

powerset(set(1),2);
set()$

powerset(set(false));
set(set(),set(false))$

powerset(set(a+b=c),1);
set(set(a+b=c))$

powerset(set(1,2,3),2);
set(set(1,2),set(1,3),set(2,3))$

errcatch(powerset(a+b=c));
[]$

is(subset(powerset(set(a,b,c,d,e)),lambda([x],is(cardinality(x)=3))) = powerset(set(a,b,c,d,e),3));
true$

is(subset(powerset(set(a,b,c,d,e)),lambda([x],is(cardinality(x)=5))) =  
	powerset(set(a,b,c,d,e),5));
true$

is(subset(powerset(set(a,b,c,d,e)),lambda([x],is(cardinality(x)=7))) = 
powerset(set(a,b,c,d,e),7));
true$

extremal_subset(set(),lambda([x],x^2), max);
set()$

extremal_subset(set(-1,0,1),lambda([x],x^2), max);
set(-1,1)$

extremal_subset(set(1,sqrt(2),3,%pi),log, max);
set(%pi)$

/* quote exp because some other tests assign a value to exp,
   and kill refuses to kill the assigned value ... (sigh)
 */
extremal_subset(set(sqrt(2),sqrt(3),sqrt(5)), 'exp, max);
set(sqrt(5))$

extremal_subset(set(1+%i,sqrt(2),1-%i),abs, max);
set(1+%i,sqrt(2),1-%i)$

extremal_subset(set(a,a+b,1.4b0,sqrt(28)),lambda([x],if atom(x) then 0 else 1), max);
set(a+b,sqrt(28))$

/* Bug #3410: extremal_subset gives bogus result with undefined predicate */
errcatch(extremal_subset({a, b, c}, abs, max));
[]$

cartesian_product();
{[]};

cartesian_product(set());
set()$

cartesian_product(set(a));
set([a])$

cartesian_product(set(),set(),set());
set()$

cartesian_product(set(a),set(b));
set([a,b])$

cartesian_product(set(u,n,k),set());
set()$

cartesian_product(set(), set(u,n,k));
set()$

cartesian_product(set(u,n,k),set(1));
set([u,1],[n,1],[k,1])$

cartesian_product(set(a,b),set(1,2));
set([a,1],[a,2],[b,1],[b,2])$

cartesian_product_list();
[[]];

cartesian_product_list([]);
[]$

cartesian_product_list([a]);
[[a]]$

cartesian_product_list([], [], []);
[];

cartesian_product_list([a], [b]);
[[a, b]];

cartesian_product_list([u,n,k], []);
[];

cartesian_product_list([], [u, n, k]);
[];

cartesian_product_list([u,n,k], [1]);
[[u,1],[n,1],[k,1]];

cartesian_product_list([a, b], [1, 2]);
[[a,1],[a,2],[b,1],[b,2]]$

cartesian_product ({11, 22, 33, 11, 11, 22}, {}, {a, a, b, b});
{};

cartesian_product_list([11, 22, 33, 11, 11, 22], [], [a, a, b, b]);
[];

cartesian_product ({11, 22, 33, 11, 11, 22}, {u}, {a, a, b, b});
{[11, u, a], [11, u, b],
 [22, u, a], [22, u, b],
 [33, u, a], [33, u, b]};

cartesian_product_list([11, 22, 33, 11, 11, 22], [u], [a, a, b, b]);
[[11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [33, u, a], [33, u, a], [33, u, b], [33, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b]];

cartesian_product ({11, 22, 33, 11, 11, 22}, {u, u, n, u, k, u}, {a, a, b, b});
{[11, u, a], [11, u, b], [11, n, a], [11, n, b], [11, k, a], [11, k, b],
 [22, u, a], [22, u, b], [22, n, a], [22, n, b], [22, k, a], [22, k, b],
 [33, u, a], [33, u, b], [33, n, a], [33, n, b], [33, k, a], [33, k, b]};

cartesian_product_list([11, 22, 33, 11, 11, 22], [u, u, n, u, k, u], [a, a, b, b]);
[[11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, n, a], [11, n, a], [11, n, b], [11, n, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, k, a], [11, k, a], [11, k, b], [11, k, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, n, a], [22, n, a], [22, n, b], [22, n, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, k, a], [22, k, a], [22, k, b], [22, k, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [33, u, a], [33, u, a], [33, u, b], [33, u, b],
 [33, u, a], [33, u, a], [33, u, b], [33, u, b],
 [33, n, a], [33, n, a], [33, n, b], [33, n, b],
 [33, u, a], [33, u, a], [33, u, b], [33, u, b],
 [33, k, a], [33, k, a], [33, k, b], [33, k, b],
 [33, u, a], [33, u, a], [33, u, b], [33, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, n, a], [11, n, a], [11, n, b], [11, n, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, k, a], [11, k, a], [11, k, b], [11, k, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, n, a], [11, n, a], [11, n, b], [11, n, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [11, k, a], [11, k, a], [11, k, b], [11, k, b],
 [11, u, a], [11, u, a], [11, u, b], [11, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, n, a], [22, n, a], [22, n, b], [22, n, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b],
 [22, k, a], [22, k, a], [22, k, b], [22, k, b],
 [22, u, a], [22, u, a], [22, u, b], [22, u, b]];

equiv_classes(set(),"=");
set()$

equiv_classes(set(),"#");
set()$

equiv_classes(set(a,b,c),"=");
set(set(a),set(b),set(c))$

equiv_classes(set(a,b,c),"#");
set(set(a,b,c))$

equiv_classes(set(1,2,3,4,5),lambda([x,y],remainder(x-y,2)=0));
set(set(1,3,5),set(2,4))$

partition_set(set(),evenp);
[set(),set()]$

partition_set(set(9),evenp);
[set(9), set()]$

partition_set(set(2,4),evenp);
[set(), set(2,4)]$

partition_set(set(a,b,c),lambda([x],false));
[set(a,b,c), set()]$

partition_set(set(a,b,c),lambda([x],true));
[set(),set(a,b,c)]$

partition_set(set(a,b,c),lambda([x],orderlessp(x,b)));
[set(b,c), set(a)]$

set_partitions(set());
set(set())$

set_partitions(set(),1);
set()$

set_partitions(set(),2);
set()$

set_partitions(set(u,n,k),1);
set(set(set(u,n,k)))$

set_partitions(set(u,n,k),2);
set(set(set(u),set(n,k)),set(set(n),set(u,k)), set(set(k),set(u,n)))$

makelist(stirling1(i,0),i,0,5);
[1,0,0,0,0,0]$

makelist(stirling1(i,i),i,0,5);
[1,1,1,1,1,1]$

factor(sum(stirling1(3,i)*x^i,i,0,3));
x*(x-1)*(x-2)$

makelist(stirling1(i,1) - (-1)^(i-1)*(i-1)!,i,1,5);
[0,0,0,0,0]$

sum(stirling1(8,k),k,1,8);  /* A & S 24.1.3 */
0$

sum(stirling1(3,k),k,1,3); 
0$

sum(stirling1(5,k)*(-1)^(5-k),k,0,5);
5!$

sum(stirling1(2,k)*(-1)^(2-k),k,0,2);
2!$

(declare([a,b],integer),0);
0$

(assume(a>0,b>0),0);
0$

stirling1(b,a);
stirling1(b,a)$

stirling2(b,a);
stirling2(b,a)$

(forget(a>0,b>0),0);
0$

(remove(a,integer), remove(b,integer),0);
0$

stirling2(0,0);
1$

stirling2(1,0);
0$

stirling2(0,1);
0$

stirling2(10,10);
1$

stirling2(10,11);
0$

stirling2(10,5) - 5 * stirling2(9,5) - stirling2(9,4);
0$

sum((-1)^(12-m) * m! * stirling2(12,m),m,0,12);
1$

/* test stirling2 simplification rules */

(remvalue(n),0);
0$

(e : stirling2(n,0),0);
0$

makelist(subst(n=i,e) - stirling2(i,0),i,-5,5);
''(makelist(0,i,-5,5))$

(e : stirling2(n,1),0);
0$

makelist(subst(n=i,e) - stirling2(i,1),i,-5,5);
''(makelist(0,i,-5,5))$

(e : stirling2(n,2),0);
0$

makelist(subst(n=i,e) - stirling2(i,2),i,-5,5);
''(makelist(0,i,-5,5))$

(e : stirling2(n,n),0);
0$

makelist(subst(n=i,e) - stirling2(i,i),i,-5,5);
''(makelist(0,i,-5,5))$

(assume(n >=0), declare(n,integer), declare(k,integer), declare(kk,integer), assume(k >=0),0);
0$

stirling1(n,n);
1$

stirling1(kk,kk);
stirling1(kk,kk)$

stirling1(1,kk);
stirling1(1,kk)$

stirling1(1,k);
kron_delta(1,k)$

stirling1(n,0);
stirling1(n,0)$

stirling1(n+1,0);
0$

stirling1(n,1);
stirling1(n,1)$

stirling1(n+1,1);
(-1)^(n) * (n)!$

stirling1(n,n-1);
stirling1(n,n-1)$

stirling1(n+1,n);
-binomial(n+1,2)$

stirling2(n,n);
1$

stirling2(n,0);
stirling2(n,0)$

stirling2(n+1,0);
0$

stirling2(n,1);
stirling2(n,1)$

stirling2(n+1,1);
1$

stirling2(n,2);
stirling2(n,2)$

stirling2(n+1,2);
2^n -1$

stirling2(n,n-1);
stirling2(n,n-1)$

stirling2(n+1,n);
binomial(n+1,2)$

(forget(n>=0), forget(k >=0), remove(n,integer),remove(k,integer),remove(kk,integer),0);
0$

(remvalue(e),0);
0$

is(cardinality(set_partitions(set())) = belln(0));
true$

is(cardinality(set_partitions(set(1))) = belln(1));
true$

is(cardinality(set_partitions(set(1,2))) = belln(2));
true$

is(cardinality(set_partitions(set(1,2,3))) = belln(3));
true$

belln([5,6]);
[belln(5),belln(6)]$

integer_partitions(0);
set([])$

integer_partitions(1);
set([1])$

integer_partitions(2);
set([1,1],[2])$

is(cardinality(integer_partitions(25)) = 1958)$
true;

map(lambda([x], apply("+",x)), integer_partitions(25));
set(25)$

integer_partitions(2,1);
set([2])$

integer_partitions(2,2);
set([1,1],[2,0])$

integer_partitions(5,3);
set([5,0,0],[4,1,0],[3,1,1],[3,2,0],[2,2,1])$

multinomial_coeff(0);
1$

multinomial_coeff(1);
1$

multinomial_coeff(5);
1$

multinomial_coeff(2,3,4);
(2+3+4)! / (2! * 3! * 4!)$

factor(sum(multinomial_coeff(i,5-i) * x^(5-i) * y^i,i,0,5));
(x+y)^5$

diff((x+y+z)^9,x,3,y,6);
''(multinomial_coeff(3,6,0) * 3! * 6!)$

kron_delta(false,false);
1$

/* need to have true and false sysconsts (not standard) for this to work
kron_delta(false,true);
0$
*/

kron_delta(true,true);
1$

kron_delta(0,0);
1$

kron_delta(a+b,a+b);
1$

kron_delta(rat(x), x);
1$

kron_delta(x,y) - kron_delta(y,x);
0$

kron_delta(x,y) / 42 - kron_delta(y,x) / 42;
0$

kron_delta(%i*x,%i*y) - kron_delta(%i*y,%i*x);
0$

kron_delta(0.42,0.42);
1$

kron_delta(0.42, 42/100);
kron_delta(0.42, 42/100)$

kron_delta(2,3);
0$

kron_delta(x,x);
1$

kron_delta(x,x-1);
0$

kron_delta(%i*x,%i*y);
kron_delta(%i*x,%i*y)$

kron_delta(%i*x,%i*x);
1$

ratsimp(kron_delta(%i*(x+1)^2,%i*(x^2+2*x+1)));
1$

(assume(a > b),0);
0$

kron_delta(a,b);
0$

kron_delta(%i*a,%i*b);
0$

(forget(a > b),0);
0$

(assume(a < 1, b >= 3/2),0);
0$

kron_delta(a,b);
0$

kron_delta(%i,%i);
1$

kron_delta(5+%i,5+%i);
1$

kron_delta(5-%i,5+%i);
0$

kron_delta(3 + %i/7,1 + %i/7);
0$

kron_delta(1 + %i/5,1 + %i/7);
0$

/* new kronecker delta tests for multivariable version */

(map('forget, facts()),0);
0$

errcatch(kron_delta(x));
[]$

kron_delta();
1$

kron_delta(sqrt(2), 1/sqrt(2), %pi);
0$

kron_delta(a,b,a);
kron_delta(a,b)$

subst(a=c, kron_delta(a,b,rat(c)));
kron_delta(c,b)$

kron_delta(a,b)-kron_delta(-a,-b);
0$

kron_delta(a,-b)-kron_delta(-a,b);
0$

kron_delta(a,b,-c)-kron_delta(-a,-b,c);
0$

kron_delta(-a,b,-c)-kron_delta(a,-b,c);
0$

conjugate(kron_delta(a+%i,b,c));
kron_delta(a+%i,b,c)$

cabs(kron_delta(a,b,23 +%i));
kron_delta(a,b,23 + %i)$

abs(kron_delta(l,s,s));
kron_delta(l,s)$

sign(kron_delta(u,n,k,1));
pz$

featurep(kron_delta(a+%i, cos(x - %i), 42/19),'integer);
true$

/* end new kronecker delta tests */

every(f,[]);
true$

every(f,set());
true$

every(evenp,set());
true$

every(evenp,set(2));
true$

every(evenp,set(%pi));
false$

every(evenp,set(2,4,6,%pi));
false$

every(evenp,set(1,2,4,6));
false$

every("=",[],[]);
true$

every("=",[1,2],[2,1]);
false$

every("#",[a,b],[b,a]);
true$

some(f,[]);
false$

some(f,set());
false$

some(oddp,set());
false$

some(oddp,set(%i));
false$

some(oddp,set(%i,1));
true$

some(oddp,[1,%i]);
true$

some("<",[a,1],[4,2]);
true$

some("=",[a,4],[a,5]);
true$

some("<=",[5,a],[6,a]);
true$

rreduce("+",[],0);
0$

rreduce("+",[a],0);
a$

rreduce("+",[a,b]);
a+b$

rreduce(adjoin, [1,2,3,4], set());
set(1,2,3,4)$

rreduce(lambda([x,y],x),[a,b,c,d]);
a$

rreduce(lambda([x,y],y),[a,b,c,d]);
d$

rreduce(concat,["a","m","h"],"");
"amh"$

flatten(rreduce(f,[1,2,3,4]));
f(1,2,3,4)$

lreduce("+",[],0);
0$

lreduce("+",[a],0);
a$

lreduce("+",[a,b]);
a+b$

lreduce(lambda([x,y],x),[a,b,c,d]);
a$

lreduce(lambda([x,y],y),[a,b,c,d]);
d$

lreduce(concat,["a","m","h"],"");
"amh"$

flatten(lreduce(f,[1,2,3,4]));
f(1,2,3,4)$

xreduce('max,[]);
minf$

xreduce('min,[]);
inf$

xreduce('max,[0,1]);
1$

xreduce('min,[0,1]);
0$

xreduce('max,[],x);
x$

xreduce('min,[],x);
x$

xreduce("and",[]);
true$

xreduce("or",[]);
false$

xreduce("and",[true]);
true$

xreduce("and",[false]);
false$

xreduce("and",[true,true],false)$
false$

xreduce("or",[true]);
true$

xreduce("or",[false]);
false$

xreduce("or",[true,true],false)$
true$

xreduce("and",[]);
true$

xreduce("or",[]);
false$

xreduce("and",[true]);
true$

xreduce("and",[false]);
false$

xreduce("and",[true,true],false)$
false$

xreduce("or",[true]);
true$

xreduce("or",[false]);
false$

xreduce("or",[true,true],false)$
true$

(nary ("@@@"), declare ("@@@", nary), "@@@" ([L]) := apply (FOO, L), kill (FOO));
done;

xreduce ("@@@", [a, e, c, b, d]);
FOO (a, e, c, b, d);

xreduce ("@@@", {a, e, c, b, d});
FOO (a, b, c, d, e);

(infix ("%%%"), "%%%" (aa, bb) := BAR (aa, bb), kill (BAR));
done;

xreduce ("%%%", [a, e, c, b, d]);
BAR (BAR (BAR (BAR (a, e), c), b), d);

xreduce ("%%%", {a, e, c, b, d});
BAR (BAR (BAR (BAR (a, b), c), d), e);

makeset(i,[i],set());
set()$

makeset(i,[i],[[1]]);
set(1)$

makeset(i,[i],[[true],[false]]);
set(true,false)$

makeset(i/j,[i,j],[[2,6],[6,28]]);
set(2/6,6/28)$

num_partitions(0);
1$

every(is, makelist(num_partitions(i)=cardinality(integer_partitions(i)),i,1,15));
true$

/* SF bug #2975: "number of distinct partitions gives wroing result" */

every ("=",
       makelist (num_partitions (n, 'list), n, 1, 10),
       makelist (makelist (num_partitions (m), m, 1, n), n, 1, 10));
true;

every ("=",
       makelist (num_distinct_partitions (n, 'list), n, 1, 10),
       makelist (makelist (num_distinct_partitions (m), m, 1, n), n, 1, 10));
true;

(distinctp(l) := is(cardinality(setify(l)) = length(l)),0);
0$

(chk(n) := cardinality(subset(integer_partitions(n),distinctp)), 0);
0$

every(is, makelist(num_distinct_partitions(i)=chk(i),i,0,10));
true$

(remfunction(chk,distinctp),0);
0$

divisors(1);
set(1)$

divisors(2);
set(1,2)$

divisors(28);
set(1,2,4,7,14,28)$

divisors([28]);
[set(1,2,4,7,14,28)]$

divisors(a=b);
divisors(a) = divisors(b)$

every(is, makelist(divsum(i) = xreduce("+",divisors(i)),i,1,100));
true$

moebius(1);
1$

moebius(2);
-1$

moebius(3);
-1$

moebius([3,4]);
[moebius(3),moebius(4)]$

/* See A & S 24.3.1 */

every(is, makelist(xreduce("+", map(moebius, divisors(i))) = 0,i,2,100));
true$

(rprimep(i,j) := block([ ],
  if integerp(i) and integerp(j) then if gcd(i,j) > 1 then 0 else 1
  else funmake(rprimep,[i,j])),0);
0$

every(is, makeset(moebius(i*j) = moebius(i) * moebius(j) * rprimep(i,j),[i,j],
cartesian_product(setify(makelist(i,i,1,15)),setify(makelist(j,j,1,15)))));
true$

/* Tests for random_permutation */

(set_random_state (make_random_state (1234)), 0);
0;

(L : '[a + 1, b - 2, c * d, %pi, %e], S : setify (L), 0);
0;

[random_permutation (L), random_permutation (L), random_permutation (L)];
'[[a + 1, %e, c*d, b - 2, %pi], [b - 2, a + 1, c*d, %e, %pi], [a + 1, c*d, b - 2, %e, %pi]];

[random_permutation (S), random_permutation (S), random_permutation (S)];
'[[c*d, b - 2, a + 1, %pi, %e], [%pi, %e, a + 1, b - 2, c*d], [b - 2, %pi, a + 1, %e, c*d]];

apply ("+", makelist (if random_permutation ([1, 2, 3, 4]) = [4,2,1,3] then 1 else 0, i, 1, 1000));
41;

/* Tests for sublist_indices */

sublist_indices ([], lambda([x], x='b));
[];

errcatch (sublist_indices (1, lambda([x], x='b)));
[];

sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], lambda ([x], x='b));
[2, 3, 7, 9];

sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], lambda ([x], integerp (x)));
[5, 6, 8];

sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
[1, 2, 3, 4, 7, 9];

sublist_indices ([true, false, false, true, true], identity);
[1, 4, 5];

sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0], identity);
[1, 4, 5];

(kill (P), P(x) := ordergreatp (x, 'm), sublist_indices ('[a, %pi, x, z, h, y, %e, 1, s], P));
[3, 4, 6, 9];

sublist_indices ('[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], lambda ([x], evenp(x) and primep(x)));
[3];

/* Tests for sublist (not part of nset but related functionality) */

sublist ([], lambda([x], x='b));
[];

errcatch (sublist (1, lambda([x], x='b)));
[];

sublist ('[a, b, b, c, 1, 2, b, 3, b], lambda ([x], x='b));
[b, b, b, b];

sublist ('[a, b, b, c, 1, 2, b, 3, b], lambda ([x], integerp (x)));
[1, 2, 3];

sublist ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
[a, b, b, c, b, b];

sublist ([true, false, false, true, true], identity);
[true, true, true];

sublist ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0], identity);
[1 > 0, 2 > 1, 2 > 0];

(kill (P), P(x) := ordergreatp (x, 'm), sublist ('[a, %pi, x, z, h, y, %e, 1, s], P));
[x, z, y, s];

sublist ('[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], lambda ([x], evenp(x) and primep(x)));
[2];

/* from mailing list 2009-08-27 "what happened to 'ev' ?" */

block ([l1: [[2,3], [3,4], [4,5]]], local(s_list),
  s_list(list, option) := sublist(list, lambda([x], ev(option))),
  s_list(l1, x[2]<4));
[[2, 3]];

block ([l1: [[2,3], [3,4], [4,5]]], local(s_list_indices),
  s_list_indices(list, option) := sublist_indices(list, lambda([x], ev(option))),
  s_list_indices(l1, x[2]<4));
[1];

/* SF bug 2698078  set_partitions does not produce simplified sets */
(l : set_partitions({1,2,3,4},3),0);
0$

is(l = expand(l));
true$

map(lambda([s], xreduce('union,s)), l);
set(set(1,2,3,4))$

map(lambda([s], xreduce('intersection,s)), l);
set(set())$

(l : set_partitions({1,2,3,4}),0);
0$

is(l = expand(l));
true$

map(lambda([s], xreduce('union,s)), l);
set(set(1,2,3,4))$

map(lambda([s], xreduce('intersection,s)), l);
set(set(), set(1,2,3,4))$

(l : set_partitions(set(a,b, set(c)),2),0);
0$

is(l = expand(l));
true$

map(lambda([s], xreduce('union,s)), l);
set(set(a,b,set(c)))$

map(lambda([s], xreduce('intersection,s)), l);
set(set())$

(l : set_partitions(set(a,b, set(c))),0);
0$

is(l = expand(l));
true$

map(lambda([s], xreduce('union,s)), l);
set(set(a,b,set(c)))$

map(lambda([s], xreduce('intersection,s)), l);
set(set(),set(a,b,set(c)))$

(remvalue(l),0);
0$

in_exactly_one(set());
set()$

in_exactly_one(set(l), set(s), set(s));
set(l)$

in_exactly_one(set(r), set(e), set(n), set(e), set(e));
set(r,n)$

in_exactly_one(set(m), set(a), set(x), set(i,m,a));
set(i,x)$

in_exactly_one(set(x),set(x), set(a,b));
set(a,b)$

/* bug reported to mailing list, is(f("x") > 0) => Lisp error
 * following example from Matthew Gwynne 2010-04-29, thanks Matthew!
 */

(
 /* F as specified in original example
 F : {{gv("CSup"),-gv("DiagF"),-gv("DisT"),-gv("ProgF"),-gv("SymA"),-gv("Via")},
    {-gv("CSup"),-gv("DiagF"),-gv("DisT"),-gv("ProgF"),-gv("SymA"),-gv("Via")},
    {gv("CSup"),-gv("DiagF"),-gv("DisT"),-gv("ProgF"),-gv("SymA"),-gv("Via")},
    {-gv("CSup"),-gv("DiagF"),gv("DisT"),-gv("ProgF"),gv("SymA"),-gv("Via")},
    {-gv("CSup"),gv("DiagF"),-gv("DisT"),-gv("ProgF"),gv("SymA"),gv("Via")},
    {gv("CSup"),gv("DiagF"),-gv("DisT"),-gv("ProgF"),gv("SymA"),gv("Via")},
    {gv("CSup"),gv("DiagF"),gv("DisT"),-gv("ProgF"),gv("SymA"),gv("Via")},
    {gv("CSup"),gv("DiagF"),gv("DisT"),-gv("ProgF"),gv("SymA"),gv("Via")},
    {-gv("CSup"),gv("DiagF"),-gv("DisT"),gv("ProgF"),gv("SymA"),gv("Via")},
    {gv("CSup"),gv("DiagF"),gv("DisT"),gv("ProgF"),gv("SymA"),gv("Via")},
    {gv("CSup"),gv("DiagF"),gv("DisT"),gv("ProgF"),gv("SymA"),gv("Via")}}, */
 /* here is a smaller (fewer variables) example */
 F : {{gv("CSup"),-gv("DiagF"),-gv("DisT")},
      {gv("CSup"),gv("DiagF"),gv("DisT")},
      {gv("CSup"),gv("DiagF"),gv("DisT")}},
 var_cs(F) := map(abs,apply(union,listify(F))),
 all_tass(V) :=
  map(setify,
   apply(cartesian_product,
     map(lambda([v],{-v,v}),listify(V)))),
 fullcnf2fulldnf(F) := setdifference(all_tass(var_cs(F)),F),
 fullcnf2fulldnf(F));

{{-abs(gv("CSup")),-abs(gv("DiagF")),-abs(gv("DisT"))},{-abs(gv("CSup")),-abs(gv("DiagF")),abs(gv("DisT"))},
 {-abs(gv("CSup")),abs(gv("DiagF")),-abs(gv("DisT"))},{-abs(gv("CSup")),abs(gv("DiagF")),abs(gv("DisT"))},
 {abs(gv("CSup")),-abs(gv("DiagF")),-abs(gv("DisT"))},{abs(gv("CSup")),-abs(gv("DiagF")),abs(gv("DisT"))},
 {abs(gv("CSup")),abs(gv("DiagF")),-abs(gv("DisT"))},{abs(gv("CSup")),abs(gv("DiagF")),abs(gv("DisT"))}}$

/* full_listify - ID: 3005820 */
full_listify(rat(3/4));
3/4$

/* is union nary? */
xreduce('union,[]);
set()$

/* kron_delta is scalar */

featurep (kron_delta, scalar);
true;

(kill (a, b), declare ([a, b], nonscalar), 0);
0;

(a * kron_delta (i, j)) . b, dotscrules=true;
(a . b)*'kron_delta (i, j);

/* verify that scalar declaration is really needed */
(a * kran_dalta (i, j)) . b, dotscrules=true;
(a * kran_dalta (i, j)) . b;

/* SF bug #3049: "set should act like list" */

(kill (a, b, c, d, foo, bar, baz), foo : {a, b, c, d});
{a, b, c, d};

([a, b] : [17, 29], bar : '{a, b, c, d});
{a, b, c, d};

is (foo = bar);
true;

baz : {a, b, c, d};
{17, 29, c, d};

is (baz = subst (['a = a, 'b = b], foo));
true;

op (foo);
"{";

op (bar);
"{";

"{" (a, b, c, d);
{17, 29, c, d};

/* examples listed under "Bugs" in doc/info/nset.texi -- all work as expected now */

{[x], [rat (x)]};
{[x], [''(rat(x))]};

setify ([[rat(a)], [rat(b)]]);
{[''(rat(a))], [''(rat(b))]};

orderlessp ([rat(a)], [rat(b)]);
true;

is ([rat(a)] = [rat(a)]);
true;

{x, rat (x)};
{x, ''(rat(x))};

/* for the record, q, r, s example is treated in greater generality in rtest1 */

(kill (q, r, s), q: x^2,  r: (x + 1)^2,  s: x*(x + 2), 0);
0;

[orderlessp (q, r), orderlessp (r, s), orderlessp (q, s)]; 
[true, false, false];

kron_delta (1/sqrt(2), sqrt(2)/2);
1;

sign (1/sqrt(2) - sqrt(2)/2);
zero;

/* apply(op({...}), [...]) doesn't yield a (($SET) ...) expression
 * bug reported to mailing list 2016-10-27
 */
(S1:{1}, S2:apply(op(S1), [2]));
{2};

?eq(?caar(S1), 'set);
true;

?eq(?caar(S2), 'set);
true;

is (S1 = apply(op(S1), args(S1)));
true;

