vermaseren / form

The FORM project for symbolic manipulation of very big expressions
GNU General Public License v3.0
1.14k stars 136 forks source link

occurs() freezes with tensors #74

Closed tueda closed 7 years ago

tueda commented 8 years ago

Update (3 Nov 2016) occurs() still have a problem with tensors. See below.


The following program doesn't print the term:

V p;
L F = p.p;

if (occurs(p));
  P "%t";
endif;
.end
tueda commented 8 years ago

More details:

CF f;
CT t;
V p,q;
I i;

L F =

* Found:
  + p
  + f(p)
  + p(i)

* Not found:
  + p.p
  + p.q
  + t(p)
;

if (occurs(p));
  P "%t";
endif;

.end
CF f;
CT t;
V p;
I i;
L F =

* Found:
  + i
  + f(i)
  + p(i)

* Freeze:
  + t(i)
;

if (occurs(i));
  P "%t";
endif;

.end
vermaseren commented 8 years ago

Repaired

tueda commented 8 years ago

In the above examples, the problems for tensors still remain:

CT t;
V p;

L F =
* Not found:
  + t(p)
;

if (occurs(p)) P "%t";
.end
CT t;
I i;

L F =
* Freeze:
  + t(i)
;

if (occurs(i)) P "%t";
.end

The latter could have a more practical problem when one wants to detect something going wrong by checking occurrence of a symbol, for example,

S x;
I mu;
L F =
  g_(1,mu)
;

* Check if the symbol "x" wrongly remains in the expression, unfortunately will freeze.
if (occurs(x)) P "%t";
.end
tueda commented 7 years ago

Still it has problems in the following test set:

S x,y; I i,j; V p,q; CT t; CF f,g;

L F1 = 1; L F2 = x; L F3 = 1/x; L F4 = i; L F5 = p; L F6 = p(i); L F7 = p(N1?); L F8 = p.p; L F9 = p.q; L F10 = t; L F11 = t(i); L F12 = t(p); L F13 = f; L F14 = f(1); L F15 = f(x); L F16 = f(-x); L F17 = f(1/x); L F18 = f(x+y); L F19 = f(i); L F20 = f(-i); L F21 = f(i+j); L F22 = f(p); L F23 = f(-p); L F24 = f(p+q); L F25 = f(p(i)); L F26 = f(p(N1?)); L F27 = f(p.p); L F28 = f(p.q); L F29 = f(t); L F30 = f(t(i)); L F31 = f(t(p)); L F32 = g(f(x)); L F33 = g(f(i)); L F34 = g(f(p)); L F35 = g(f(t)); L F36 = g(g(f)); L F37 = g(i,p); L F38 = g(1,i,p); L F39 = g(1,g(2,3-f(x))+g(t(p),t(i)));

if (occurs(x)) multiply a(1); if (occurs(i)) multiply a(2); if (occurs(p)) multiply a(3); if (occurs(t)) multiply a(4); if (occurs(f)) multiply a(5); chainin a;

antiputinside acc,a; id acc(?a) = 1;

P; .end assert succeeded? assert result("F1") =~ expr("1") assert result("F2") =~ expr("a(1)") assert result("F3") =~ expr("a(1)") assert result("F4") =~ expr("a(2)") assert result("F5") =~ expr("a(3)") assert result("F6") =~ expr("a(2,3)") assert result("F7") =~ expr("a(3)") assert result("F8") =~ expr("a(3)") assert result("F9") =~ expr("a(3)") assert result("F10") =~ expr("a(4)") assert result("F11") =~ expr("a(2,4)") assert result("F12") =~ expr("a(3,4)") assert result("F13") =~ expr("a(5)") assert result("F14") =~ expr("a(5)") assert result("F15") =~ expr("a(1,5)") assert result("F16") =~ expr("a(1,5)") assert result("F17") =~ expr("a(1,5)") assert result("F18") =~ expr("a(1,5)") assert result("F19") =~ expr("a(2,5)") assert result("F20") =~ expr("a(2,5)") assert result("F21") =~ expr("a(2,5)") assert result("F22") =~ expr("a(3,5)") assert result("F23") =~ expr("a(3,5)") assert result("F24") =~ expr("a(3,5)") assert result("F25") =~ expr("a(2,3,5)") assert result("F26") =~ expr("a(3,5)") assert result("F27") =~ expr("a(3,5)") assert result("F28") =~ expr("a(3,5)") assert result("F29") =~ expr("a(4,5)") assert result("F30") =~ expr("a(2,4,5)") assert result("F31") =~ expr("a(3,4,5)") assert result("F32") =~ expr("a(1,5)") assert result("F33") =~ expr("a(2,5)") assert result("F34") =~ expr("a(3,5)") assert result("F35") =~ expr("a(4,5)") assert result("F36") =~ expr("a(5)") assert result("F37") =~ expr("a(2,3)") assert result("F38") =~ expr("a(2,3)") assert result("F39") =~ expr("a(1,2,3,4,5)") *--#] Issue74 :