Message Boards Message Boards

[✓] Avoid rule based programming iteration limit exceeded?

GROUPS:

Hello,

I'm trying ti define abstract mathematical unevaluated objects such as e[1], e[1,2], e[1,2,3], etc. There are rules for these objects, such as

e[]=1
e[1,1]=e[2,2]=..=e[i,i]=e[]=1
e[1,2]=e[1,2]
e[2,1]=-e[1,2]
e[1,2,3]=e[1,2,3]
e[2,1,3]=-e[1,2,3]
e[2,3,1]=e[1,2,3],
etc.

The number of argument inside e is arbitrary but I'm first trying with two, to further generalize. I found that the following code works pretty well for this case:

e[] := 1
e[i_Integer, i_Integer] := e[]
e[i_Integer, j_Integer] := -e[j, i] /; i != j && i > j

However the following one, which should produce the same result, but is more general and useful when trying to generalize to more than two arguments, fails:

e[] := 1
e[i_Integer, i_Integer] := e[]
e[i_Integer, j_Integer] := Signature[{i, j}] e @@ Sort[{i, j}] /; i != j

since a Recursion Limit is exceeded.

Can anyone give me some clue about why this happens? Thanks a lot in advance,

Jose L. Aragon

POSTED BY: Jose Aragon
Answer
1 month ago

Sorry but in my previous post, formulae and Mathematica commands where written in a single line. These are:

e[]=1 

e[1,1]=e[2,2]=..=e[i,i]=e[]=1 

e[1,2]=e[1,2] 

e[2,1]=-e[1,2] 

e[1,2,3]=e[1,2,3] e[2,1,3]=-e[1,2,3] e[2,3,1]=e[1,2,3], etc.

The first successful attempt is:

e[] := 1

e[iInteger, iInteger] := e[] 

e[iInteger, jInteger] := -e[j, i] /; i != j && i > j

an the unsuccessful one is:

e[] := 1 

e[iInteger, iInteger] := e[] 

e[iInteger, jInteger] := Signature[{i, j}] e @@ Sort[{i, j}] /; i != j

Thanks,

Jose L. Aragon

POSTED BY: Jose Aragon
Answer
1 month ago

Jose,

your problem is that you define e[1,2] (or -e[2,1]) to be e[1,2] -- which then enters an infinite loop (e[1,2] triggers your rule again and again evaluates to e[1,2]. You need to end the recursion.

You first way works because once the order of i and j is in sort order it just returns e[i,j] because the condition on i>j is no longer met.

Your posting lost all the underscores -- you need to use the code sample.

I think you need to add a condition:

e[i_Integer, j_Integer] := 
 Signature[{i, j}] e @@ Sort[{i, j}] /; i != j && i > j
POSTED BY: Neil Singer
Answer
1 month ago

Thank you very much Neil. You're right, that is the way to stop the recursion.

POSTED BY: Jose Aragon
Answer
1 month ago

Welcome to Wolfram Community!

Please EDIT your posts to make corrections, - do NOT post same content twice.

Please make sure you know the rules and how to format your code properly, which you can find here: https://wolfr.am/READ-1ST

If you do not format code, it may become corrupted and useless to other members. Please EDIT your posts and make sure code blocks start on a new paragraph and look framed and colored like this.

int = Integrate[1/(x^3 - 1), x];
Map[Framed, int, Infinity]

enter image description here

POSTED BY: Moderation Team
Answer
1 month ago

Group Abstract Group Abstract