【发布时间】:2021-05-24 20:27:39
【问题描述】:
我想使用part 来处理不同长度的表达式,但在文档中找不到任何关于如何确定表达式部分数的内容。
我确实有零件数量的上限,所以在这种特殊情况下,我可以循环遍历这些术语,直到出现错误;但是,我想知道是否有更直接的方法?
【问题讨论】:
我想使用part 来处理不同长度的表达式,但在文档中找不到任何关于如何确定表达式部分数的内容。
我确实有零件数量的上限,所以在这种特殊情况下,我可以循环遍历这些术语,直到出现错误;但是,我想知道是否有更直接的方法?
【问题讨论】:
我不敢相信,但似乎 length 可以解决问题。
我认为它仅限于列表,因为它返回单个数字的错误,因为它们是原子。显然,我的大脑决定“不适用于原子”意味着“仅适用于列表”。
但是,这确实意味着如果表达式只有一个部分,part 和 length 都将不起作用,因此必须单独处理这种情况。
我仍然想知道是否有适用于所有情况的解决方案,所以我暂时不会将此标记为答案。
【讨论】:
length 的函数可以同时覆盖原子和非原子;最接近的是自己滚动,例如f(e) := if atom(e) then FOO else length(e),其中 FOO 代表您对原子的期望,也许是 0,无论如何这取决于您希望这些东西如何工作。但是请注意length([]) 是0,length(f()) 也是0。所以如果你说一个原子的类长度函数是0,那么你就无法区分原子和空的非原子表达式。我倾向于认为这样做最终可能会引起混乱。
part。我猜您可能正在尝试查看表达式的参数并弄清楚如何处理它。很多这类东西是由模式匹配函数(tellsimp/tellimpafter/defrule/defmatch)实现的,所以如果你正在这样做,使用模式匹配可能会更清晰、更简单,尽管模式匹配有其局限性,因此有时无法避免手动操作。
args 不适用于多项式,但只是对其进行了测试并看到它确实有效。不幸的是,我相信args 与原子表达式有同样的问题。自发地,我倾向于将原子表达式的“长度”定义为 1,而不是 0,但我想这与您所描述的问题相似。
op 和 args 适用于所有非原子表达式,如您所见。关于length(<atom>) 等于1,那么length 不区分<atom> 和[<atom>](即一个元素的列表,即<atom>)。至少还有一个其他系统说,实际上,任何<atom> 实际上是<typeofatom>(<atom>),因此让运算符得到<typeofthing>,而得到参数本身得到<atom>。这是一个有趣的想法,但无论好坏,Maxima 都区分了原子和非原子。