Predicates, Goals and Queries

## 3.2 Predicates, Goals and Queries

- Conjunction and Disjunction

Where other programming languages have procedures and functions, Prolog and ECLiPSe have predicates. A predicate is something that has a truth value, so it is similar to a function with a boolean result. A predicate definition simply defines what is true. A predicate invocation (or call) checks whether something is true or false. A simple example is the predicate integer/1, which has a built-in definition. It can be called to check whether something is an integer:

>     integer(123)           is true
>     integer(atom)          is false
>     integer([1,2])         is false

A predicate call like the above is also called a goal. A starting goal that the user of a program provides is called a query. To show queries and their results, we will from now on use the following notation:

>     ?- integer(123).
>     Yes.
>     ?- integer(atom).
>     No.
>     ?- integer([1,2]).
>     No.

A query can simply be typed at the eclipse prompt, or entered into the query field in a tkeclipse window. Note that it is not necessary to enter the `?-` prefix. On a console input, is however necessary to terminate the query with a full-stop (a dot followed by a newline). After executing the query, the system will print one of the answers Yes or No.

### 3.2.1 Conjunction and Disjunction

Goals can be combined to form conjunctions (AND) or disjunctions (OR). Because this is so common, Prolog uses the comma for AND and the semicolon for OR. The following shows two examples of conjunction, the first one is true because both conjuncts are true, the second is false:

>     ?- integer(5), integer(7).
>     Yes.
>     ?- integer(5), integer(hello).
>     No.

In contrast, a disjunction is only false if both disjuncts are false:

>     ?- ( integer(hello) ; integer(5) ).
>     Yes.
>     ?- ( integer(hello) ; integer(world) ).
>     No.

As in this example, it is advisable to always surround disjunctions with parentheses. While not strictly necessary in this example, they are often required to clarify the structure.
In practice, when answering queries with disjunctions, the system will actually give a separate Yes answer for every way in which the query can be satisfied (i.e. proven to be true). For example, the following disjunction can be satisfied in two ways, therefore system will give two Yes answers:

>     ?- ( integer(5) ; integer(7) ).
>     Yes (0.00s cpu, solution 1, maybe more)
>     Yes (0.02s cpu, solution 2)

The second answer will only be given after the user has explicitely asked for more solutions. Sometimes the system cannot decide whether an answer is the last one. In that case, asking for more solutions may lead to an alternative No answer, like in the following example:

>     ?- ( integer(5) ; integer(hello) ).
>     Yes (0.00s cpu, solution 1, maybe more)
>     No (0.02s cpu)

Of course, as long as there was at least one Yes answer, the query as a whole was true.