Hello, Sage Community!

Based on this question by user @Nasser, and follow up comments, there seems to be a bug in SageMath. The following statement is syntactically correct:

```
integrate('ln(x)', x, algorithm='fricas')
```

but it returns `integral(ln(x), x)`

, which is indeed correct, but not expected. The equivalent statement

```
integrate(ln(x), x, algorithm='fricas')
```

returns the expected answer, 'x*log(x) - x'.

The problem seems to be that `ln`

is not defined in Fricas, but `log`

is. When Fricas receives an unknown function---let's say `func`

---, it returns the abstract integral

```
t
++
| func(%A)d%A
++
```

which is converted by Sage to

```
integral(func(x), x)
```

And that is what happens with `ln`

: Sage uses the Symbolic Ring `SR`

to convert the string `'ln(x)'`

to a symbolic math function, but then, it doesn't convert it to `log(x)`

, and passes `ln(x)`

to Fricas, which is a unknown function for it. So, an abstract integral is returned.

As @Nasser points out:

But I am using sagemath? If a user has to know what each other CAS system that sagemath uses prefer or not prefer in terms of the input, what is the point then of using Sagemath? One can just use the other CAS system. I mean, I am using ln(t) which Sagemath knows, right? A user should not care if the system that sagemath ends up calling to do the integration knows or not know about ln(t). Sagemath should have then converted ln(t) automatically internally to log(t) in this case. At least this is what I would have expected. But thanks for the answer. I changed my calls to use "log(t)" and issue resolved for me.

I have to agree with this statement. SageMath should handle the adequate conversion for the CAS it passes its input.

In order to see more detail about this process, and a possible point where things go wrong, please see the answer to this question.

Thanks in advance!