[ Control | The ECLiPSe Built-In Predicates | Reference Manual | Alphabetic Index ]

# ~ +Goal

The sound negation operator. If Goal is not ground, the predicate delays.

Goal
  Callable term or a variable.

## Description

This is the sound negation operator. It can be used instead of not/1, or \+/1 (the negation as failure operators). It is known that negation as failure may yield non-logical results if the Goal contains free variables. To avoid this, ~/1 delays if Goal is not ground. If the free variables are bound later in the execution, the delayed predicate is woken and executed and may yield success or failure. While ~/1 always behaves logically, in some cases it delays where negation as failure or constructive negation would have immediately (and correctly) failed.

### Modes and Determinism

- ~(+) is semidet

### Modules

This predicate is sensitive to its module context (tool predicate, see @/2).

### Fail Conditions

Fails if Goal can be satisfied

## Examples

    Success:
        ~ 3 = 4.
        ~ 3 = X,            (delays ...
            X = 4.             ... and succeeds with X = 4)
    Fail:
        ~ 3 = 3.
        ~ 3 = X,            (delays ...
            X = 3.             ... and fails)
        ~ X = X,            (delays ...
            X = 3.             ... and fails)

## See Also

not / 1, \+ / 1, suspend / 3