结合模式来收集术语

时间:2011-12-08 16:14:02

标签: wolfram-mathematica design-patterns

我有一个Mathematica表达式(称为expr),它是许多术语的总和。此外,我有一个列表(称为var),其中包含一些可能出现在这些术语中的变量和函数。

我想要做的第一件事是提取包含许多变量和函数的术语一定次数。例如,如果是var = {a, f[_]},那么我可能想要提取包含变量a一次和函数f 2次的所有项。 f[f[a + b]]是满足这些标准的术语的示例。

我想做的第二件事是创建一个包含原始表达式的所有项的列表(称为输出)。该列表应该根据它们包含var中指定的变量和函数的次数对术语进行分组。 对于var = {a, f[_]},输出将为output = {{sum of those terms containing 0 * a and 0 * f[_], "sum of..." 1 * a and 0 f, "sum of..." 2a 0f, ... }, {"sum of..." 0a 1f, "sum of..." 1a, 1f, ... }}

给定问题2的解决方案,很容易解决问题1:要提取表达式的某个术语,您只需从列表输出中选择正确的元素。出于这个原因,我试图解决问题2.为了保持清晰,我开始使用一个简单的表达式,只包含一个术语。首先,我生成一个模式列表

expr = f[a + f[y]]
var = {{a, 1}, {f[_], 3}}
basicpattern[symbol_, n_, term_] = 
Hold[Table[Count[{term}, symbol, 10] == i, {i, 0, n}]]
basicpattern[#1, #2, expr] & @@@ var // ReleaseHold

输出

{{False, True}, {False, False, True, False}}

解释是:变量a出现一次,函数f出现2次。     现在我想将基本模式中的列表的外部产品用于组合模式。然后,新的模式列表可以与Cases一起使用,从expr中选择术语并将它们放在列表中。

我陷入困境:如何在列表中获取列表的外部产品?我猜到了

Outer[And, {{True, False}, {True, False, False, False}}, 1]

但这并没有给出八个术语。

更新

在Sjoerd的帮助下,我走得更远。

expr = f[a + f[y]];
var = {{a, 1}, {f[_], 3}};
basicpattern[symbol_, n_, term_] := 
Table[Hold[Count[{term}, symbol, 10]] == i, {i, 0, n}];
basicpattern[#1, #2, expr] & @@@ var;
Outer[And, ##] & @@ %;
test = %[[2, 3]]
%// ReleaseHold

作为输出

Hold[Count[{f[a + f[y]]}, a, 10]] == 1 &&
Hold[Count[{f[a + f[y]]}, f[_], 10]] == 2
True

解释是f [a + f [y]]包含一次a和两次f [_]。 外部产品是这样的测试列表。

假设我将expr更改为

expr = f [a + f [y]] + g [z] + y ^ 2 - 13 x + 12a + a f [x]

如何使用测试内容收集包含一次和两次f [_]的所有术语?

1 个答案:

答案 0 :(得分:1)

你的故事很长,但我想你的问题归结为:

  

如何在列表中获取列表的外部产品?

如果这是你唯一想知道的,你就近了。它可以像这样完成:

booleanLists = {{True, False}, {True, False, False, False}};

Outer[And, ##] & @@ booleanLists

(* ==>  {{True, False, False, False}, {False, False, False, False}} *)