2

使用计算机代数系统 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 是给定的,我不知道如何以简单的方式对其进行转换。可能我可以在一个循环中完成所有事情,但问题对我来说似乎很简单,我想知道是否真的没有更好的方法。

有任何想法吗?

更新:我刚刚有了一个解决方法的想法,但不幸的是它并没有解决我的问题。我设法通过使用笛卡尔积将 A 带入正确的形式:

makeset(union(a,x), [x], cartesian_product(A));

我仍然得到同样的错误: x 应该是一个集合。好吧,它是一个集合,因为 A 是一个集合。如果我写 {x} 而不是 x,一切都按预期工作,但我想将 x 与非 {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 的 bug tracker上的对话。

解决方案: 为了让这个问题的读者更容易,这里的解决方案(来自 Stavros 的回答和我的第一次更新)是一个结合了两种解决方法的示例:

(%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}}
4

2 回答 2

2

makeset 与 makelist 不同,它评估它的参数,这是一个糟糕的设计。对于那个很抱歉。有一个解决方法:

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

但我们会在以后的版本中解决这个问题。

谢谢让我们注意到这个。

    -s

PS 我认为你会从 Maxima 邮件列表中获得比 StackOverflow 更好的关于 Maxima 问题的回复。

于 2011-11-18T20:39:33.343 回答
1

我认为以下可能更简单。

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

这么晚才回复很抱歉。把这个留在这里以防有人遇到它。

于 2012-05-30T21:36:24.077 回答