Opened 4 years ago

Last modified 4 years ago

## #18259 new defect

# comparison of symbolic functions

Reported by: | dkrenn | Owned by: | |
---|---|---|---|

Priority: | major | Milestone: | sage-6.7 |

Component: | symbolics | Keywords: | |

Cc: | rws, vdelecroix | Merged in: | |

Authors: | Reviewers: | ||

Report Upstream: | N/A | Work issues: | |

Branch: | Commit: | ||

Dependencies: | Stopgaps: |

### Description

We have the following strange (wrong) behavior:

sage: f(x) = 2*x sage: bool(f == 2*x) True

On the other hand we have

sage: f(x) = 2*x sage: g(y) = 2*y sage: bool(f == g) False

### Change History (4)

### comment:1 Changed 4 years ago by

### comment:2 follow-up: ↓ 3 Changed 4 years ago by

This is a consequence of how coercion and comparison are implemented:

sage: var('y') y sage: f(x)=x*y sage: A=x*y sage: cSR=parent(f) sage: cSR.coerce_map_from(SR) Conversion map: From: Symbolic Ring To: Callable function ring with arguments (x,) sage: SR.coerce_map_from(cSR) is None True

So, A coerces into the parent of f (and not the other way around): That means that for equality testing, A is coerced into the parent of f and then the comparison is done: comparison testing in sage is defined to be "equal up to coercion" (which probably necessarily breaks in all kinds of particular cases).

If you do *not* want these things to compare equal then you should break the coercion. That might be reasonable. Conversion can still exist. Currently you can do:

sage: f+y^2 x |--> x*y + y^2

without coercion but with conversion, this would need to be:

sage: f+cSR(y^2) x |--> x*y + y^2

which does not seem unreasonable to me.

### comment:3 in reply to: ↑ 2 ; follow-up: ↓ 4 Changed 4 years ago by

Replying to nbruin: Hi Niles,

Why not modifying the comparison codes for Callable function ring?

If you do *not* want these things to compare equal then you should break the coercion. That might be reasonable. Conversion can still exist. Currently you can do:

sage: f+y^2 x |--> x*y + y^2without coercion but with conversion, this would need to be:

sage: f+cSR(y^2) x |--> x*y + y^2which does not seem unreasonable to me.

I definitely would like to be able to do `f+1`

without an error!

Vincent

### comment:4 in reply to: ↑ 3 Changed 4 years ago by

Replying to vdelecroix:

Why not modifying the comparison codes for Callable function ring?

[...]

I definitely would like to be able to do

`f+1`

without an error!

The second would probably still work if the integers still coerce into `cSR`

(and since `cSR`

inherits from `SR`

it would be a lot of work to break that). But it's a direct consequence that if `f+1`

works then `bool( cSR(1) == 1)`

will be true, basically because `cSR(1)-1`

is then 0 (instead of an error), which is what happens in the example in the ticket too.

If you're going to change the comparison for the callable function ring you'd be letting `cSR`

behave completely different from other sage parents. It would also be a lot of work because currently comparison on `cSR`

is just inherited from `SR`

.

The implementation of comparison tests on `SR`

only comes into play after the coercion framework has had its way with the arguments.

**Note:**See TracTickets for help on using tickets.

This came up in #18092.