下面這個mathematica語句怎麼理解?

DeleteCases[Tuples[IntegerDigits[43210],4],{z__/;z==0,n__}]//Short[#,4]

後面的花括弧里的內容怎麼理解,還有就是z__和n__又有什麼含義


{z__ /; z==0, n__} 是個模式表達式,表示滿足以下條件的表達式的集合:

1. {}: 最外層是個列表,

2. z__/;z==0: 列表元素中前一個或多個的值等於0.,( __ 表示一個或多個表達式形成的序列;z__ 是一個取了名字為 z 的序列;z__ /; z==0 表示一個或多個表達式形成的序列且其中每個表達式都等於 0., 這裡 /; 表示後面的表達式是對前面的表達式的約束條件,條件里用的參數 z 代表 /; 符號前面的序列里的任意元素),

3. n__: 零值元素序列後還有一個或多個任意元素組成的序列。

(注意用了這麼多話還說不大清楚的一個東西用 {z__ /; z==0, n__} 就可以精簡準確地表達。)

比如以下每一行上的表達式都是「列表,前一個或多個元素等於零,後面還有一個或多個任意元素」這種「模式」的表達式:

{0., 1}
{0., 2, 3}
{0., 1, "foobar", xyz, Sin[x]}
{0, 0., "foobar", Sin[x]}
{0, 0, 0, 2}

這裡每個表達式都能匹配上 {z__/;z==0, n__} 這個模式。「能匹配上」可以用 MatchQ 測試:

In[1]:= MatchQ[{0., "foobar", "baz"}, {z__ /; z == 0., n__}]

Out[1]= True

(你可以想想 {0, 0, 0, 0},{0, 0., 0} 這兩個應不應該匹配得上?

DeleteCases[Tuple[IntegerDigits[43210],4], {z__/;z==0,n__}] 會刪除哪些東西)

而以下幾個則匹配不成:

1 (* 外層必須得是個列表 *)
"foobar" (* 同上 *)
{} (* 雖是列表,必須要有元素才能滿足「前一個或多個元素必需值為0...」 *)
{1, Sin[x]} (* 前一個或多個元素必需值為0. *)
{1., 0., 2} (* 同上 *)
{1, 2, 3, 4}(* 同上 *)
{0.} (* 首個是零值元素,但後面沒有一個或者多個任意元素 *)
{0, 0., 0} (* 前面有三個零值元素,匹配 z__/;z==0 後用盡,但此後沒有一個或者多個任意元素,無法匹配 n__ 了,所以總的來說,匹配不上 *)

籠統地說,模式表達式可以用來精確地代表滿足一定形式或者條件的表達式的集合,然後可以據此進一步定義對特定表達式的集合的運算、替換規則,這大抵上就是 Mathematica 符號計算的基本方式。模式表達式和以此為基礎的規則替換是 Mathematica / Wolfram 語言的重要特性,也是高效編程的常用技術。官方快速入門里有一段講模式的:Patterns | Wolfram Language Introduction for Programmers,還有更全面詳細的文檔:Rules Patterns, 模式。

Mathematica / Wolfram 語言的表達式有幾種不同的顯示格式── InputForm,OutputForm,StandardForm,TraditionalForm等。比如一個列表的 StandardForm 和 InputForm 是 {1, 2, 3}, 而 FullForm 是 List[1, 2, 3],而 z__ 這個表達式的 FullForm 是 Pattern[z, BlankSequence[]] ,寫成 z_ 是省筆墨的語法定義。這些形式只是看上去不同,對 Mathematica 內核(kernel),也就是其進行計算的「大腦」來說一般都是等價的。在筆記本(notebook)里的輸出結果(即 Out[X] := 之後的結果表達式)默認是以 StandardForm 顯示的,編程的時候常常用的是 InputForm,而 FullForm 會顯示所有函數的「最完整」的形式 XXX[..., ..., ...](函數頭,方括號,參數,方括號),詳見系統文檔〈輸入和輸出形式〉。所以看到不熟悉的表達式寫法,可以先用 FullForm 作用後看看他的 FullForm 是什麼樣子,參數是哪些,各個參數是不是又自身是個複雜的結構,是不是涉及一些自己不知道的系統符號:

In[1]:= FullForm[{z__/;z==0,n__}]
Out[1]//FullForm= List[Condition[Pattern[z,BlankSequence[]],Equal[z,0]],Pattern[n,BlankSequence[]]]

z__ 的 FullForm 是 Pattern[z,BlankSequence[]]],表示一個或多個表達式組成的序列,這個模式取了個名字 z

patt /;z==0 的 FullForm 是 Condition[patt,Equal[z,0]],表示對 patt 進行了條件限定的一個模式

...

把不熟悉的系統符號逐一查清楚──語法規則、用例等。比如:

  • Pattern

  • Blank

  • BlankSequence (__)

  • Condition (/;)

  • ...

各個部份都理解後,合起來才能理解。


推薦閱讀:

Mathematica導入牆外網頁數據失敗,軟體內如何實現科學上網?
理論物理學生如何用mathematica記錄筆記並進行管理?
Matlab 怎麼填充曲線相交的區域呢?
Mathematica如何導入某個csv或者excel文件的指定行和列?
如何看待工科生因為現在數學軟體太強了,進而對數學不重視的觀念?

TAG:WolframMathematica |