コンピューター代数システム 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 の 3 番目の引数がリストのリストまたはリストのセットでなければならないことを理解している限りです。マキシマのドキュメントから:
(%i5) makeset (sin(x), [x], {[1], [2], [3]});
(%o5) {sin(1), sin(2), sin(3)}
x をセットにしたいので、私の場合、3 番目の引数はセットのリストのセットでなければなりません。しかし、 A が与えられており、それを簡単に変換する方法がわかりません。おそらく、ループ内のすべてにできるかもしれませんが、問題は非常に単純に思え、本当に良い方法がないのではないかと思っています。
何か案は?
更新:回避策のアイデアがありましたが、残念ながら問題は解決しません。cartesian_product を使用して、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 のバグ トラッカーでの会話も参照してください。
解決策: この質問の読者にとって物事を簡単にするために、ここで解決策(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}}