2011-04-06 129 views
5

好日子,瞭解跟蹤*

當試圖通過使用標準TraceTraceScan命令及其漂亮的視覺表現在最近thread發展到瞭解數學的評價程序,我遇到了一些含糊其行爲。

首先,當我評價

在[1]:=跟蹤並[a + 1,TraceOriginal->真]

我得到

缺貨[ 1] = {a + 1,{Plus},{a},{1},a + 1,1 + a,{Plus},{1},{a},1 + a}

所有子列表都對應於子評估(如文檔中所述)。最後一個表達式1+a可能與評估結果相對應,儘管在文檔中沒有明確說明。但究竟是什麼意思表達式a+11+a在列表中間? the standard evaluation sequence對應哪些評估步驟對應?

第二個奇怪的是與TraceScan。考慮以下內容:

In [1]:= list = {}; TraceScan [AppendTo [list,StyleForm [#,「Input」]] &,(a + 1),_,AppendTo [list,#] &];列表

輸出[1] = {一個+ 1,另外,一個,一個,,1,1 +一個,另外,,1,一個,一,1 + A,A + 1}

你可以看到,在列表中的最後兩個表達式是1+aa+1。兩者都是(分)評估的結果。但真正的產出是1+a,所以我不明白爲什麼a+1在評估鏈的末尾?爲什麼在評估鏈中間沒有a+1,因爲它是Trace的情況?這是一個錯誤嗎?

P.S.這些結果轉載於Mathematica 7.0.1和5.2。

+0

我認爲這應該遷移到:http://math.stackexchange.com/ – RobertPitt 2011-04-06 07:03:33

+2

@RobertPitt這個問題不是關於數學。它只與* Mathematica *的內部相關。正如你所看到的,我儘可能使用原始的例子:當'a'未定義時,在* Mathematica *中評估表達式'a + 1'。我正在嘗試理解* Mathematica *內部發生的事情,當我評估這個時。這似乎並不像預期的那麼簡單...... – 2011-04-06 07:55:31

+1

@RobertPitt這是一個常見的誤解。標籤Mathematica是指由Wolfram Research Inc.開發的Mathematica程序。它不等同於_Mathematics_或_math_。另見http://meta.stackexchange.com/q/81152/158668。 – 2011-04-06 08:59:59

回答

3

TraceScanfp參數是用兩個參數調用的。首先是最初的未評價表達。第二個是評估的結果。在你的例子中,第二個AppendTo正在使用第一個參數,所以你看到了未評估的表達式。將#更改爲#2,然後您會看到您期望的結果。

還要注意,第二個參數是包裹在HoldForm(文檔儘管),所以一般必須小心使用,其保持它的參數爲fp參數以避免產生僞評價的功能。

Trace和TraceScan

Trace的行爲相當詳細的描述Mathematica 8 documentation比較。它指出,默認情況下,Trace僅在之後顯示錶達式頭部和參數已被評估。於是,我們看到這樣一個序列:

In[28]:= SetAttributes[f, Orderless] 
     Trace[f[a, 1]] 
Out[29]= {f[a,1],f[1,a]} 

只有輸入表達式,並將其結果被示出。 TraceOriginal選項控制(引號)「是否在評估其頭部和參數前查看錶達式」。當這個選項是True則輸出補充有頭部和參數表達式:

In[30]:= Trace[f[a,1], TraceOriginal->True] 
Out[30]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]} 

新的列表的第一個元素是原始表達式頭之前和參數進行評估。然後我們看到正在評估的頭和參數。最後,在頭和參數被評估之後,我們再次看到的頂級表達式。列表的最後兩個元素匹配原始跟蹤輸出的兩個元素。

正如鏈接文檔所述,Trace對返回的表達式非常有選擇性。例如,它完全省略了簡單的評估鏈。 TraceScan是全面的,併爲每次評估調用提供的功能,無論是否微不足道。您可以使用以下TraceScan表達看到一整套評價:

TraceScan[Print, f[a,1], _, Print[{##}]&] 

下表按Trace有和沒有TraceOriginal產生的輸出相匹配,與TraceScan表達的輸出一起:

Trace Trace TraceScan 
     Original 

     f[a,1] f[a,1] 
       f 
     {f}  {f 
       ,f} 
       a 
     {a}  {a 
       ,a} 
       1 
     {1}  {1 
       ,1} 
       f[1,a] 
       {f[1,a] 
       ,f[1,a]} 
f[a,1] f[a,1] {f[a,1] 
f[1,a] f[1,a] ,f[1,a]} 

由於Trace的內部是無法訪問的,所以在這個表中有一定的推測是哪個條目匹配。進一步的實驗可能會提供調整對齊的信息。但關鍵是Trace生成的所有信息都可以使用TraceScan - 而TraceScan提供的信息更多。

+0

「TraceScan」的輸出仍然有些奇怪。評估'list1 = {}; list2 = {}; TraceScan [AppendTo [list1,#]&,(a + 1),_, AppendTo [list2,#1]&];'給出兩個不同的列表:{a + 1,Plus,a,1,1 + a ,Plus,1,a}'和'{Plus,a,1,Plus,1,a,1 + a,a + 1}'... – 2011-04-06 21:50:15

+1

@Alexey這兩個列表通常會有所不同。考慮'Plus',它是第二個要評估的表達式(出現在'list1'的第二個表達式中),但它是第一個完成評估的表達式(在list2中出現的第一個表達式)。同樣,「a + 1」是要評估的第一個表達式,但評估完成的最後一個表達式。匹配評估的開始和結束是一件棘手的事情。 [traceView2](http://stackoverflow.com/questions/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117)使用堆棧來執行此匹配。 – WReach 2011-04-06 23:46:59

+0

@WReach非常清楚的解釋,謝謝!唯一的問題是關於Trace [a + 1,TraceOriginal-> True]和'list = {}的輸出之間的差異; TraceScan [AppendTo [list,#]&,a + 1]; list'。第一個返回一個包含中間兩個表達式的列表:'a + 1'和'1 + a'。其中第一個看起來與應用「Orderless」屬性之前的評估序列*的中間步驟相對應,第二個是應用此屬性的結果。這樣對嗎?但是在TraceScan的情況下,我找不到應用這個屬性的步驟。 – 2011-04-07 06:53:12

3

問題的第一部分很簡單。 在列表中間的表達式a+11+aOrderless屬性Plus觸發的情況,並且該條款按默認順序排列。 這是standard evaluation sequence tute中的第8個點。

TraceScan中的「奇怪」也出現在版本8中。 因爲,這是一個難得的命令,這裏是爲TraceScan

TraceScan文檔[F,EXPR,形式,FP]將f 後 評價在expr的 評價使用的詞句評價和FP前。

請注意,如果你把它應用到表達a + 1 + b

In[32]:= TraceScan[Print["f \t",#]&, a+1+b, _, Print["fp\t",#]&] 
During evaluation of In[32]:= f  a+1+b 
During evaluation of In[32]:= f  Plus 
During evaluation of In[32]:= fp Plus 
During evaluation of In[32]:= f  a 
During evaluation of In[32]:= fp a 
During evaluation of In[32]:= f  1 
During evaluation of In[32]:= fp 1 
During evaluation of In[32]:= f  b 
During evaluation of In[32]:= fp b 
During evaluation of In[32]:= f  1+a+b 
During evaluation of In[32]:= fp 1+a+b 
During evaluation of In[32]:= fp a+1+b 
Out[32]= 1+a+b 

從這裏,很明顯發生了什麼。 fp適用於評估 - 所以最終的fp實際上對應於第一個f。它直到最後纔打印,因爲子表達式需要先評估。

+0

你對TraceScan行爲的解釋對我來說並不明顯。我需要更簡潔的例子來找到這種行爲的邏輯。特別是,'Trace [a + 1 + b,TraceOriginal - > True]給出了{a + 1 + b,{Plus},{a},{1},{b},a + 1 + b,1 + A + b}'。你的意思是第二個'a + 1 + b'是評估的結果嗎?但在應用'Orderless'屬性之前,它應該只是一箇中間表達式。評估結果爲「1 + a + b」。 – 2011-04-06 09:36:34

+0

我不知道該怎麼解釋它(可能是因爲我不太清楚爲什麼最後的'fp'有它沒有評估過的形式)。無論如何,與TraceScan文檔修改的例子相比較:TraceScan [Print [「f \ t」,#]&,f [1,2 + 3],_,Print [「fp \ t」,#] &]' – Simon 2011-04-06 10:01:29

+0

謝謝你以任何方式回答。現在我理解'Trace'輸出中'Orderless'屬性的應用位置。唯一的問題仍然是關於「TraceScan」的行爲。 – 2011-04-06 10:46:55