Maxima: Использование makeset с заданным набором

Используя систему компьютерной алгебры 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 с a, а не {x} с a... Я думаю, что это может быть ошибкой в ​​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}}

person lumbric    schedule 18.11.2011    source источник


Ответы (2)


makeset, в отличие от makelist, оценивает свои аргументы, что является плохой схемой. Извини за это. Для этого есть обходной путь:

makeset('(union(x)), '[x], {[{1}]});

но мы исправим это для будущих версий.

Спасибо, что сообщили нам об этом.

    -s

PS Я думаю, вы получите лучший ответ по вопросам Maxima из списка рассылки Maxima, чем из StackOverflow.

person Stavros Macrakis    schedule 18.11.2011

Я думаю, что следующее может быть проще.

A : {{1, 2}, {3, 4}, {}};
a : {0.97};
map (lambda ([x], union (x, a)), A);
 => {{0.97}, {0.97, 1, 2}, {0.97, 3, 4}}

Извините за задержку с ответом. Оставлю это здесь на случай, если кто-то наткнется.

person Robert Dodier    schedule 30.05.2012