A list is an ordered sequence of objects and lists. In Prolog, a list is written as its elements separated by commas and enclosed in brackets. For example:
[] | This is an empty list. |
[peter, 4, abc, X] | This is a list containing four elements. There is no restrictions on the number of variables and constants in the list. |
[a, b, [c, d], e] | This list contains four elements. The third element is a list. This example shows that a list can also be an element of another list. |
The head of a list is the first element in the list. The tail of a list is the list that remains after the first element is removed. For example:
Head | Tail | |
---|---|---|
[] | undefined | undefined |
[a] | a | [] |
[a, b] | a | [b] |
[[a, b], c] | [a, b] | [c] |
[[a, b], [c, d]] | [a, b] | [[c, d]] |
A list with X as the head and Y as the tail can be expressed as [X | Y]. See the following examples.
Assume that the following program is consulted:
head([H | T],
H).
/* R1 */ tail([H | T], T). /* R2 */ list([H | T], H, T). /* R3 */ max([H],
H).
/* R4 */ |
The following queries make use of facts R1 through R3 and are quite obvious.
Query | Overall output |
---|---|
?- head([], X). | no |
?- list([], X, Y). | no |
?- head([a, b, c, d], X). | X = a |
?- tail([a], X). | X = [] |
?- list([a, b], X, Y). | X = a Y = [b] |
Note: In each step of the process of deduction, there may be more than one subgoals to be processed. In this case, only the first subgoal is considered. If there is a rule that can be applied to it, it is replaced by those subgoals found in the applied rule. If it satisfies a fact, it is removed. If no rules or facts can be applied, we have to backtrack.
Sample query:
?- max([3, 5, 2, 4], A).
Level | Results of deduction | Rules or facts to be applied | Bindings of variables |
---|---|---|---|
Original query | max([3, 5, 2, 4], A). | A = 3 | |
1 | max([5, 2, 4], X), 3 >= X. | X = 5 | |
2 | max([2, 4], X), 5 >= X, 3 >= 5. | X = 2 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | X = 4 | |
4 | 2 >= 4, 5 >= 2, 3 >= 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | X = 4 | |
4 | max([], X), 2 >= 4, 5 >= 2, 3 >= 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | - |
|
4 | max([], X), 4 < X, 2 >= 4, 5 >= 2, 3 >= 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 >= X, 3 >= 5. | - |
|
3 | max([4], X), 2 < X, 5 >= X, 3 >= 5. | X = 4 | |
4 | 2 < 4, 5 >= 4, 3 >= 5. | Satisfied. | |
5 | 5 >= 4, 3 >= 5. | Satisfied. | |
6 | 3 >= 5. | Failed! Backtracks. | |
5 | 5 >= 4, 3 >= 5. | Failed! Backtracks. | |
4 | 2 < 4, 5 >= 4, 3 >= 5. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 >= X, 3 >= 5. | - |
|
4 | max([], X), 4 < X, 2 < X, 5 >= X, 3 >= 5. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 >= X, 3 >= 5. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 >= X, 3 >= 5. | Failed! Backtracks. | |
1 | max([5, 2, 4], X), 3 >= X. | - |
|
2 | max([2, 4], X), 5 < X, 3 >= X. | X = 2 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | X = 4 | |
4 | 2 >= 4, 5 < 2, 3 >= 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 >= 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | - | |
4 | max([], X), 4 < X, 2 >= X, 5 < 2, 3 >= 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 < X, 3 >= X. | - |
|
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | X = 4 | |
4 | 2 < 4, 5 < 4, 3 >= 4. | Satisfied. | |
5 | 5 < 4, 3 >= 4. | Failed! Backtracks. | |
4 | 2 < 4, 5 < 4, 3 >= 4. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | X = 4 | |
4 | max([], X), 2 < 4, 5 < 4, 3 >= 4. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | - | |
4 | max([], X), 4 < X, 2 < X, 5 < X, 3 >= X. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 < X, 3 >= X. | Failed! Backtracks. | |
1 | max([5, 2, 4], X), 3 >= X. | Failed! Backtracks. | |
Original goal | max([3, 5, 2, 4], A). | - |
|
1 | max([5, 2, 4], A), 3 < A. | A = 5 | |
2 | max([2, 4], X), 5 >= X, 3 < 5. | X = 2 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | X = 4 | |
4 | 2 >= 4, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | - |
|
4 | max([], X), 4 < X, 2 >= X, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 >= X, 3 < 5. | - |
|
3 | max([4], X), 2 < X, 5 >= X, 3 < 5. | X = 4 | |
4 | 2 < 4, 5 >= 2, 3 < 5. | Satisfied. | |
5 | 5 >= 2, 3 < 5. | Satisfied. | |
6 | 3 < 5. | Satisfied! Output: A = 5 Then backtracks. |
|
5 | 5 >= 2, 3 < 5. | Failed! Backtracks. | |
4 | 2 < 4, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | X = 4 | |
4 | max([], X), X >= 4, 2 < 4, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | - |
|
4 | max([], X), 4 < X, 2 < X, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | Failed! Backtracks. | |
2 | max([2, 4], X), 5 >= X, 3 < 5. | Failed! Backtracks. | |
1 | max([5, 2, 4], A), 3 < A. | - |
|
2 | max([2, 4], A), 5 < A, 3 < A. | A = 2 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | X = 4 | |
4 | 2 >= 4, 5 < 2, 3 < 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 < 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | - |
|
4 | max([], X), 4 < X, 2 >= X, 5 < 2, 3 < 2. | Failed! Backtracks. | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | Failed! Backtracks. | |
2 | max([2, 4], A), 5 < A, 3 < A. | - |
|
3 | max([4], A), 2 < A, 5 < A, 3 < A. | A = 4 | |
4 | 2 < 4, 5 < 4, 3 < 4. | Succeeded. | |
5 | 5 < 4, 3 < 4. | Failed! Backtracks. | |
4 | 2 < 4, 5 < 4, 3 < 4. | Failed! Backtracks. | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | A = 4 | |
4 | max([], X), 4 >= X, 2 < 4, 5 < 4, 3 < 4. | Failed! Backtracks. | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | - |
|
4 | max([], A), 4 < A, 2 < A, 5 < A, 3 < A. | Failed! Backtracks. | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | Failed! Backtracks. | |
2 | max([2, 4], A), 5 < A, 3 < A. | Failed! Backtracks. | |
1 | max([5, 2, 4], A), 3 < A. | Failed! Backtracks. | |
Original goal | max([3, 5, 2, 4], A). | Failed! There are no more rules or facts that can be applied. | |
Overall output | A = 5 |