(wx)Maxima: определение количества частей выражения

Я хотел бы использовать part для обработки выражений разной длины, но не смог найти в документации ничего, что касалось бы определения количества частей выражения.

У меня есть верхняя граница количества частей, поэтому в этом конкретном случае я могу перебирать термины, пока не получу ошибку; однако мне было интересно, есть ли более прямой метод?


person Rax Adaam    schedule 22.02.2021    source источник


Ответы (1)


Я не могу в это поверить, но, похоже, length делает свое дело.

Я предположил, что он ограничен списками, потому что он возвращает ошибку для отдельных чисел, потому что они являются атомами. Видимо, мой мозг решил, что не работает с атомами, значит работает только со списками.

Однако это означает, что ни part, ни length не будут работать, если выражение состоит только из одной части, поэтому этот случай должен обрабатываться отдельно.

Мне все равно было бы интересно узнать, есть ли решение, которое будет работать во всех случаях, поэтому я пока не буду отмечать это как ответ.

person Rax Adaam    schedule 22.02.2021
comment
Не существует единой length-подобной функции, охватывающей как атомы, так и неатомы; самое близкое - это свернуть свое собственное, что-то вроде f(e) := if atom(e) then FOO else length(e), где FOO представляет то, что вы ожидаете от атомов, возможно, 0, в любом случае это зависит от того, как вы хотите, чтобы все работало. Но обратите внимание, что length([]) равно 0, а также length(f()) равно 0. Поэтому, если вы скажете, что функция, подобная длине атома, равна 0, то вы не сможете отличить атомы от пустых, неатомарных выражений. Я склонен думать, что это может в конечном итоге вызвать путаницу. - person Robert Dodier; 22.02.2021
comment
Кроме того, вы упоминаете part. Я предполагаю, что вы, возможно, пытаетесь посмотреть на аргументы выражения и выяснить, что с ним делать. Многие подобные вещи реализуются функциями сопоставления с образцом (tellsimp/tellimpafter/derule/defmatch), и поэтому, если это то, что вы делаете, может быть понятнее и проще использовать сопоставление с образцом, хотя сопоставление с образцом имеет свои ограничения. , так что иногда не избежать делать это вручную. - person Robert Dodier; 22.02.2021
comment
Спасибо, Роберт. В данном случае я пытаюсь назвать члены многочлена, длина которых может варьироваться (например, от 1 члена до максимум ~8). Я использую эти выражения для построения вывода TeX для общего полиномиального длинного деления (включая раскрашивание отдельных терминов). Я не думал, что args будет работать для полинома, но только что проверил его и увидел, что он работает. К сожалению, я полагаю, что у args такая же проблема с атомарными выражениями. Спонтанно я был бы склонен определить длину атомарного выражения как 1, а не ноль, но я полагаю, что это имеет те же проблемы, что и то, что вы описали. - person Rax Adaam; 22.02.2021
comment
Как вы обнаружили, op и args работают для всех неатомарных выражений. Если length(<atom>) равно 1, то length не отличает <atom> от [<atom>] (т.е. список из одного элемента, а именно <atom>). Существует по крайней мере еще одна система, которая говорит, что любое <atom> на самом деле является <typeofatom>(<atom>), так что получение оператора получает <typeofthing>, а получение аргумента получает <atom>. Это интересная идея, но, к лучшему или к худшему, Maxima различает атомы и неатомы. - person Robert Dodier; 22.02.2021