2011-11-18 12 views
2

使用的計算機代數系統千里馬我嘗試做一個非常簡單的設置操作:給定的套一組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}} 

回答

2

makeset,不像makelist ,評估它的論點,這是一個糟糕的設計。對於那個很抱歉。對此有一種解決方法:

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

但我們將爲未來的版本修復此問題。

感謝您將此引入我們的注意。

-s 

PS我想你會從Maxima郵件列表中獲得比從StackOverflow更好的答覆。

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

對不起,回覆遲了。如果有人遇到它,留在這裏。