Be careful about terminology. You wrote, *"I think, `evalb` is used to compare numbers and `is` used to compare expression, logic. Is this true?"* That sentence is not precise, in Maple terminology, and that can lead to misunderstanding here.

Think instead in terms of technical Maple terminology, for example whether something is of **type** **numeric**. That includes floating-point numbers, integers, and fractions (rationals, with integers in numerator and denominator). That does *not* include exact representations such as **sqrt(2)**. Yes, that denotes a "number" in the common mathematical sense, but it is not of **type** **numeric** to Maple. A related and useful class is things of **type** **realcons**, which would produce something of type **numeric** if **evalf** were applied.

The **evalb** command can compare equality and inequality relations of items that are both of **type** **numeric**. It can also test whether two structues are *identically* the same, by which I mean that they have the same address in memory.

So you cannot generally, reliably compare two expressions (of **type** **algebraic** but not **numeric**) with the **evalb** command unless you can put both into a *canonical* form, in which case they are uniquified and the canonical forms are identically the same.

Your example,

**f := x + 1 = (x^2 - 1)/(x - 1);**

can be simplified (using **simplify** or **normal**, for example) so that lhs and rhs of that normal form are in fact the very same expression. That is why **evalb(simplify(f))** returns **true**.

But not all expressions can be easily put by Maple into some canonical form. (For example, there are mathematically equivalent formulations for some expressions involving trig and special function calls for which a choice of canonical reformulation is not obvious.) That's one advantage of using **is**, as it has a variety of mathematical operations it can do for comparison.

Another significant advantage of the **is** command is that it can (often) utilize assumptions on names in symbolic expressions.

Here are some tips:

1) For mathematical testing of an equation (ie. **A=B**), it can sometimes help is by querying **is(A-B=0)** since (while zero-testing is hard) at least the target form is clear: zero.

2) In general the **is** command performs more strongly that **simplify** (or its friends, **normal**, **radnormal**, **shake**, **evalc**, **rationalize**, **combine**, and **expand**) alone. It is rare that it helps to make a call such as **is(simplify(A-B)=0)** , but examples do exist.

3) For inequality testing involving expressions of **type** **realcons** you may generally be better off invoking the **is** command, rather than applying **evalf** and risking a mistake due to close roundoff error. Like most "rules", this too has its exceptions.

4) If you are going to use the **is** comand then you might have to write your code so that it handles the case that **is** returns **FAIL** instead of **true** or **false**.

5) For verification of floating-point results from a computation against a target value you might look at the **testfloat** command, or the **verify** command with a float comparator.

6) For verification of data structures (lists, sets, Vectors, etc) you could also look at a call of the **verify** command, according to the type of the structures' members.

It's a large topic, and a textbook on Maple could be written while covering it comprehensively.

Background reading, Help pages for Topics:

- **testfloat**

- **verify**

- **evalr**, **shake**

- **testeq**

- **signum**

- type **numeric**, **realcons**, **algebraic**

- **evalc**, **radnormal**, **evala**, **normal**