Spad issue: can't coerce Symbol to Expression(Integer)

5 views

Neven Sajko

Aug 5, 2021, 10:01:07 AM8/5/21
I have the following package:

)abbrev package GGLC GeographicLibCoefficients
GeographicLibCoefficients() : Exports == Implementation where

L ==> List
I ==> Integer
P ==> PositiveInteger

EXPR ==> Expression(I)

RAT ==> Fraction(I)
PLY ==> Polynomial(RAT)
UPLY(var) ==> UnivariatePolynomial(var, RAT)
RATFUNC ==> Fraction(PLY)
TAY(var) ==> UnivariateTaylorSeries(EXPR, var, 0)

Exports ==> with

tau1_m_sigma: () -> EXPR

maxpow(): P ==
8

tau1_m_sigma(): EXPR ==
integrand: EXPR := sqrt(1 + 'k2 * sin('sigma)^2)
I1: TAY('eps) := integrate(taylor(
subst(integrand,
'k2 = 4 * 'eps
/ (1 - 'eps)^2) *
(1 - 'eps),
'eps = 0),
'sigma)
I1_truncated: EXPR := reduce(_+,
[coefficient(I1, n) *
'eps^n for
n in 0..maxpow()])
A1: UPLY('eps) := simplify(subst(I1_truncated,
'sigma = 2*%pi) /
(2*%pi))
tau1: EXPR := I1_truncated / A1
tau1 - sigma

This is me trying to compile the package:

using old system compiler.
GGLC abbreviates package GeographicLibCoefficients
------------------------------------------------------------------------
initializing NRLIB GGLC for GeographicLibCoefficients
compiling into NRLIB GGLC
compiling local maxpow : () -> PositiveInteger
GGLC;maxpow is replaced by 8
Time: 0.00 SEC.

compiling exported tau1_m_sigma : () -> Expression Integer
****** comp fails at level 7 with expression: ******
error in function tau1_m_sigma

(SEQ
(|:=| (|:| |integrand| (|Expression| (|Integer|)))
(|sqrt| (+ 1 (* '|k2| (^ | << | (|sin| '|sigma|) | >> | 2)))))
(|:=| (|:| I1 (|UnivariateTaylorSeries| (|Expression| (|Integer|)) '|eps| 0))
(|integrate|
(|taylor|
(* (|subst| |integrand| (= '|k2| (/ (* 4 '|eps|) (^ (- 1 '|eps|) 2))))
(- 1 '|eps|))
(= '|eps| 0))
'|sigma|))
(|:=| (|:| |I1_truncated| (|Expression| (|Integer|)))
(|reduce| +
(COLLECT (IN |n| (SEGMENT 0 (|maxpow|)))
(* (|coefficient| I1 |n|) (^ '|eps| |n|)))))
(|:=| (|:| A1 (|UnivariatePolynomial| '|eps| (|Fraction| (|Integer|))))
(|simplify|
(/ (|subst| |I1_truncated| (= '|sigma| (* 2 |%pi|))) (* 2 |%pi|))))
(|:=| (|:| |tau1| (|Expression| (|Integer|))) (/ |I1_truncated| A1))
(|exit| 1 (- |tau1| |sigma|)))
****** level 7 ******
\$x:= (sin (QUOTE sigma))
\$m:= \$EmptyMode
\$f:=
((((|integrand| #) (|maxpow| #) (* #) (+ #) ...)))

>> Apparent user error:
Cannot coerce (QUOTE sigma)
of mode (Symbol)
to mode (Expression (Integer))

I notice that Fricas says that it can't coerce a Symbol to an
Expression. Is that a bug, or do I really have to convert symbols into
expressions explicitly?

Thanks,
Neven

Ralf Hemmecke

Aug 5, 2021, 10:39:14 AM8/5/21
to Neven Sajko, fricas-devel
> I notice that Fricas says that it can't coerce a Symbol to an
> Expression. Is that a bug, or do I really have to convert symbols into
> expressions explicitly?

A difference between interpreter and compiler is that the interpreter
tries to find some coercion or retraction function and applies them
implicitly. That makes the life of the user usually easier, but the
interpreter can make wrong guesses of your intentions.

The compiler does such an coercion only in very simple cases otherwise
YOU must provide the right conversion of the object into the respective
type. And this is a good thing to require programmers to be explicit.
Suppose in the future there would be a little change in the FriCAS
library so that (if you were not explicit) the compiler would choose
another coercion function. That shouldn't actually matter much since
coercions are supposed to be injections, but being an injection is just
a convention and is not forced by the compiler.

My suggestion is that you should always be as explicit as possible. You
will appreciate it when you read you program after 5 years.

Ralf

Neven Sajko

Aug 5, 2021, 11:17:58 AM8/5/21
to Ralf Hemmecke, fricas-devel
(That last sigma in my code should be 'sigma, instead. But that seems
unrelated to the issue I'm currently facing.)

Well, I can't seem to solve this. I tried replacing sin('sigma) with both
sin(('sigma)@EXPR)
and
sin(('sigma)::EXPR)
but nothing seems to help, I still get about the same diagnostic error.

Thanks,
Neven

Ralf Hemmecke

Aug 5, 2021, 1:52:03 PM8/5/21
to Neven Sajko, fricas-devel
Hi Neven,

as a general remark, I suggest to you that you make simpler expressions.
Then you have better chances to find the problem, see attachment.

Maybe the two lines

error "ENDE"
)fin

in that file may help you in the future to nail down where exactly the
error is.

As you have seen, I have split up the expressions into simpler pieces
and added the respective type information.

But when it comes to

I1: TAY(eps) := integrate(t, sigma)

I must stop, because I have also other things to do and do not know an
easy solution for it. Maybe, since t is a Taylor series over EXPR, you
can simply first truncate and after that integrate wrt. sigma.

I hope, with that bit of code you may be able to continue yourself.

Good luck.

Ralf

Waldek Hebisch

Aug 5, 2021, 2:10:14 PM8/5/21