使用计算机代数系统 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}}