member(X, [X|_]).
member(X, [_|Xs]) :- member(X, Xs).
?- member(X, [a, b, c]).
-true .
-X = a ;
-X = b ;
-X = c ;
-false.
+ X = a
+; X = b
+; X = c
+; false.
```
and so do conjunctive queries:
```
g(x). g(y). g(z).
h(call(f, X)).
?- h(X), X.
-true .
-X = call(f, x) ;
-X = call(f, y) ;
-X = call(f, z).
+ X = call(f,x)
+; X = call(f,y)
+; X = call(f,z).
```
Note that the values of variables belonging to successful queries are
arithmetic operators with the usual precedences,
```
-?- write_canonical(-5 + 3 - (2 * 4) // 8).
--(+(-(5), 3), //(*(2, 4), 8))
+?- write_canonical(-5 + 3 - (2 * 4) // 8), nl.
+ -(+(-5,3),//(*(2,4),8))
true.
```
* [`si`](src/prolog/lib/si.pl)
The predicates `atom_si/1`, `integer_si/1`, `atomic_si/1`
and `list_si/1` implement sound type checks. They raise
- instantiation errors of no decision can be made.
+ instantiation errors if no decision can be made.
They are declarative replacements for logically flawed
lower-level type tests. For instance, instead of `integer(X)`,
write `integer_si(X)` to ensure soundness of your programs.