Максима: Использование makeset с заданным набором - PullRequest
2 голосов
/ 18 ноября 2011

Используя систему компьютерной алгебры 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}}

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

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

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

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

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

    -s

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

1 голос
/ 31 мая 2012

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

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}}

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

...