randRange(3, 8) randRange(2, 4) randRange(3, 8) randRange(2, 4) shuffle([function(e,r,n,a){return["+",["*",e,n],a]},function(e,r,n,a){return["-",["*",e,n],a]},function(e,r,n,a){return["+",n,["*",e,a]]},function(e,r,n,a){return["-",n,["*",e,a]]},function(e,r,n,a){return["-",["*",e,n],["*",r,a]]},function(e,r,n,a){return["-",["*",r,n],["*",e,a]]},function(e,r,n,a){return["*",n,["-",a,e]]},function(e,r,n,a){return["*",["-",e,n],a]},function(e,r,n,a){return["+",["^",n,2],["*",r,["^",a,2]]]},function(e,r,n,a){return["+",["*",r,["^",n,2]],["^",a,2]]},function(e,r,n,a){return["-",["^",n,2],["*",r,["^",a,2]]]},function(e,r,n,a){return["-",["*",r,["^",n,2]],["^",a,2]]},function(e,r,n){return["-",["*",r,n],e]},function(e,r,n,a){return["+",["*",e,a],r]},function(e,r,n,a){return["+",["*",n,a],["*",r,n],["-",a]]}],2) !isNaN(expr(FUN1(A, B, 0, NaN), true)) !isNaN(expr(FUN1(A, B, NaN, 0), true)) randRange(-6, 6) randRange(-6, 6) randRange(-6, 6) expr(FUN2(C, D, "x", "y")) expr(FUN2(C, D, Y, Z)) expr(FUN2(C, D, Y, Z), true) expr(FUN1(A, B, "x", "y")) shuffle(["<code>x "+binop(1)+" y = "+TEXT1+"</code>","<code>x "+binop(2)+" y = "+TEXT2+"</code>"]).join(" and ")
expr(FUN1(A, B, X, VALU2)) expr(FUN1(A, B, X, VALU2), true) !FUN1_XONLY "left"

Si TEXTS, encuentra X binop(1) (Y binop(2) Z).

VALU1

Ahora, encuentra X binop(1) VALU2:

Encuentra X binop(1) y:

\qquad X binop(1) NEED_VALU1 ? VALU2 : "y" = SUBS1

\qquad \hphantom{X binop(1) VALU2} = VALU1.

\qquad \hphantom{X binop(1) y} = VALU1.

expr(FUN1(A, B, VALU2, X)) expr(FUN1(A, B, VALU2, X), true) !FUN1_YONLY "right"

Si TEXTS, encuentra (Y binop(2) Z) binop(1) X.

VALU1

Ahora, encuentra VALU2 binop(1) X:

Encuentra x binop(1) X:

\qquad NEED_VALU1 ? VALU2 : "x" binop(1) X = SUBS1

\qquad \hphantom{VALU2 binop(1) X} = VALU1.

\qquad \hphantom{x binop(1) X} = VALU1.

Primero encuentra Y binop(2) Z:

\qquad Y binop(2) Z = SUBS2

\qquad \hphantom{Y binop(2) Z} = VALU2.

No necesitamos encontrar Y binop(2) Z pues x binop(1) y depende solamente del operando NEED_VALU1_ONLY.