Эта проблема известна как преждевременная оценка.Что происходит, так это то, что sum
использует обычную модель оценки Maple, которая включает в себя оценку аргументов вызовов процедур перед выполнением вычисления в теле процедуры.
Посмотрите, в частности, на приведенный ниже результат простого вызова creneau(i)
.Этот результат - то, что sum
видит в качестве аргумента в вашем примере.Другими словами, операция mod
произошла преждевременно, потому что вызов creneau(i)
был оценен преждевременно.
creneau := n -> (2*floor((n mod 24)/12)):
creneau(38);
2
oops := creneau(i);
/1 \
2 floor|-- i|
\12 /
eval(oops, i=38);
6
add(oops, i=38..38);
6
sum(oops, i=38..38);
6
sum(creneau(i), i=38..38);
6
sum('creneau(i)', i=38..38);
2
add(creneau(i), i=38..38);
2
Обычный способ исправить это - использовать add
вместо sum
(поскольку add
имеет так называемые "специальные правила оценки") или заключить первый аргумент в sum
с помощью так называемых кавычек не оценки или задержки.
К сожалению, в 2DВ режиме математического ввода символ суммирования с довольно печатным изображением (Sigma) выглядит одинаково как для sum
, так и для add
.Это делает эту ошибку все труднее обнаружить.
Я бы даже предположил, что вы вставили суммирование 2D Math из палитры "Выражение" стандартного графического интерфейса пользователя Maple, которая, к сожалению, имеет sum
, но не add
.для новых ошибок пользователя такого рода.
См. также справочную страницу на специальных правилах оценки .
acer