Немного кода на Mathematica 8. Но я схитрил, и на входе на самом деле вот такое:
Код:
{{A[1], a[1]}, {A[2], a[2]}, {A[3], a[3]}, {A[4], a[4]}}
А код работы с этим такой:
Код:
Needs["Combinatorica`"]; (* SetPartitions *)
Clear[zeroCondition, partitionEqMap, partitionEqMap2]
partitionEqMap[f_, p_List] := And @@ Map[Equal @@ # &, Map[f, p, {2}]]
partitionEqMap2[f_, p_List] := Equal @@ Append[Map[Plus @@ (f /@ #) &, p], 0]
zeroCondition[expr_] := Block[
{len = Length[expr], pns},
pns = SetPartitions[len];
Or @@ Map[And[
partitionEqMap[expr[[#, 2]] &, #],
partitionEqMap2[expr[[#, 1]] &, #]] &, pns]]
Документация не прилагается.