Используя систему компьютерной алгебры Maxima, я пытаюсь выполнить очень простую операцию над множествами: учитывая набор множеств A и набор a, я хотел бы построить набор из объединения всех элементов A и a.
Так, например, пусть будет A = {{1,2}, {3,4}, {}} и a = {0,97}. Набор, который я ищу, - {{0,97,1,2}, {0,97, 3,4}, {0,97}}.
Ну, я полагаю, самый простой способ - использовать makeset:
makeset(union(a,x), [x], A);
К сожалению, это возвращает ошибку:
"$union": argument must be a set; found: x
Ну, насколько я понял, проблема в том, что третьим аргументом makeset должен быть список списков или набор списков. Из документации по максимам:
(%i5) makeset (sin(x), [x], {[1], [2], [3]});
(%o5) {sin(1), sin(2), sin(3)}
Поскольку я хочу, чтобы x был множеством, третий аргумент должен быть множеством списков множеств в моем случае. Но А дано, и я понятия не имею, как его легко преобразовать. Вероятно, я мог бы все в цикле или около того, но проблема кажется мне довольно простой, и мне интересно, есть ли действительно лучший путь.
Есть идеи?
Обновление: У меня только есть идея обойти, но, к сожалению, это не решает мою проблему. Мне удалось привести A в правильную форму с помощью cartesian_product:
makeset(union(a,x), [x], cartesian_product(A));
Тем не менее я получаю ту же ошибку: x должен быть набором. Ну, это множество, так как A это множество множеств. Если я пишу {x} вместо x, все работает как положено, но я хочу объединить x с not {x} с ... Я думаю, что это может быть ошибка в Maxima.
Обновление 2: Та же проблема со списками:
makeset(append(x, [a]), [x], full_listify(cartesian_product(A)));
Возвращает ошибку:
append: argument must be a non-atomic expression; found x
Обновление 3: См. Также разговор в Система отслеживания ошибок Maxima .
Решение:
Чтобы облегчить читателям этот вопрос, вот решение (из ответа Ставроса и моего первого обновления) пример с обоими обходными путями в сочетании:
(%i1) A : {{a,b},{c},{d}};
(%o1) {{a,b},{c},{d}}
(%i2) makeset('(union(x, {new1, new2})), [x], cartesian_product(A));
(%o2) {{a,b,new1,new2},{c,new1,new2},{d,new1,new2}}