使用的計算機代數系統千里馬我嘗試做一個非常簡單的設置操作:給定的套一組A和一組,我想建立一套工會A和a的所有元素。 因此,例如讓A = {{1,2},{3,4},{}}和a = {0,97}。我搜索的集合是{{0,97,1,2},{0,97,3,4},{0,97}}。千里馬:使用makeset與一組給定
好吧,我想最簡單的方法是通過使用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}連接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's bug tracker。
解決方案: 爲了讓事情這個問題,這裏的解決方案(從斯塔夫羅斯的answere和我的第一次更新)有兩種解決方法的例子結合的讀者更容易:
(%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}}