Понимание трассировки * - PullRequest
5 голосов
/ 06 апреля 2011

Добрый день,

Когда я пытался понять последовательность оценки Mathematica с помощью стандартных команд Trace и TraceScan и их прекрасных визуальных представлений, разработанных в недавнем потоке , я столкнулся с некоторыми неясности в их поведении.

Прежде всего, когда я оцениваю

В [1]: = Trace [a + 1, TraceOriginal-> True]

Я получаю

Из [1] = {А + 1, {плюс}, {а}, {1}, а + 1,1 + а, {плюс}, {1}, {а}, 1 + а}

Все подсписки соответствуют подоценкам (как указано в Документации). Последнее выражение 1+a, вероятно, соответствует результату оценки, хотя это явно не указано в документации. Но что именно означают выражения a+1 и 1+a в середине списка? Каким этапам оценки стандартная последовательность оценки соответствует?

Вторая странность с TraceScan. Учтите следующее:

В [1]: = список = {}; TraceScan [AppendTo [список, StyleForm [#, "Вход"]] &, (а + 1), _, AppendTo [список, #] &]; список

* 1 035 * Из [1] = {
a + 1 , Plus , Plus, a , a, 1 , 1, 1 + a, Плюс , Плюс, 1 , 1, a , a, 1 + a, a + 1}

Вы можете видеть, что последние два выражения в списке 1+a и a+1. Оба являются результатами (под) оценки. Но реальный результат - 1+a, и поэтому я не понимаю, почему a+1 находится в конце цепочки оценки? И почему нет a+1 в середине цепочки оценки, как это было в случае Trace? Это ошибка?

P.S. Эти результаты воспроизводятся с Mathematica 7.0.1 и 5.2.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Аргумент fp для TraceScan вызывается с двумя аргументами.Первое - это оригинальное неоцененное выражение.Второе - результат оценки.В вашем примере второй AppendTo использует первый аргумент, поэтому вы видите неоцененное выражение.Измените # на #2, и тогда вы увидите ожидаемые результаты.

Также обратите внимание, что второй аргумент - , а не , заключенный в HoldForm (несмотря на документацию), поэтому вВ общем случае следует позаботиться об использовании функции, которая содержит свои аргументы для аргумента fp, чтобы избежать создания ложных оценок.

Сравнение Trace и TraceScan

ПоведениеTrace подробно описан в документации Mathematica 8 .В нем говорится, что по умолчанию 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 предоставляет больше.

3 голосов
/ 06 апреля 2011

Первая часть вопроса проста.В выражениях a+1 и 1+a в середине списка находится атрибут Orderless, равный Plus, и термины расположены в порядке по умолчанию.Это точка номер 8 в стандартной последовательности оценки tute.

«Странность» в TraceScan также возникает в версии 8. Поскольку это редкая команда, вот документация для TraceScan

TraceScan [f, expr, form, fp] применяет f к оценке и fp после оценки к выражениям, используемым при оценке expr.

Обратите внимание, что если вы примените его к выражению 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.Он не печатается до самого конца, потому что сначала нужно вычислять подвыражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...