列表是一個按序排列的物件及列表。在 Prolog 中,列表以一對方括號包著以逗號分隔的元素。例如︰
[] | 空的列表。 |
[peter, 4, abc, X] | 這列表內有四個元素。列表內變量和常數的數目並沒有限制。 |
[a, b, [c, d], e] | 這列表內有四個元素,其中第三個元素是一個列表。這個例子說明一個列表也可以成為另一列表的元素。 |
一個列表的頭就是列表的第一個元素,而列表的尾就是移除了第一個元素後剩下的列表。例如︰
頭 | 尾 | |
---|---|---|
[] | 未定義 | 未定義 |
[a] | a | [] |
[a, b] | a | [b] |
[[a, b], c] | [a, b] | [c] |
[[a, b], [c, d]] | [a, b] | [[c, d]] |
如果 X 和 Y 分別是一個列表的頭和尾,該列表可以寫成 [X | Y。試看看以下例子。
假設以下程序被查閱︰
head([H | T], H).
/* R1 */ tail([H | T], T). /* R2 */ list([H | T], H, T). /* R3 */ max([H], H).
/* R4 */ |
以下查詢使用了事實 R1 至 R3,而結果亦很明顯。
查詢 | 整體輸出 |
---|---|
?- 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] |
注意︰在推斷過程的每一步中,可能需要處理多於一個子目標。在這情況下,只有第一個子目標被考慮。如果多於一個規則可以應用在這子目標的話,子目標會被使用過的規則內的子目標取代;如它滿足了一個事實,它會被移除;如果沒有事實或規則可用,我們需要回索。
查詢的例子︰
?- max([3, 5, 2, 4], A).
層次 | 推斷的結果 | 應用了的事實或規則 | 約束變量 |
---|---|---|---|
原來的查詢 | 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. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | X = 4 | |
4 | max([], X), 2 >= 4, 5 >= 2, 3 >= 5. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | - |
|
4 | max([], X), 4 < X, 2 >= 4, 5 >= 2, 3 >= 5. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 >= 5. | 失敗了!回索。 | |
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. | 滿足了。 | |
5 | 5 >= 4, 3 >= 5. | 滿足了。 | |
6 | 3 >= 5. | 失敗了!回索。 | |
5 | 5 >= 4, 3 >= 5. | 失敗了!回索。 | |
4 | 2 < 4, 5 >= 4, 3 >= 5. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 >= X, 3 >= 5. | - |
|
4 | max([], X), 4 < X, 2 < X, 5 >= X, 3 >= 5. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 >= X, 3 >= 5. | 失敗了!回索。 | |
2 | max([2, 4], X), 5 >= X, 3 >= 5. | 失敗了!回索。 | |
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. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 >= 2. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | - | |
4 | max([], X), 4 < X, 2 >= X, 5 < 2, 3 >= 2. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 >= 2. | 失敗了!回索。 | |
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. | 滿足了。 | |
5 | 5 < 4, 3 >= 4. | 失敗了!回索。 | |
4 | 2 < 4, 5 < 4, 3 >= 4. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | X = 4 | |
4 | max([], X), 2 < 4, 5 < 4, 3 >= 4. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | - | |
4 | max([], X), 4 < X, 2 < X, 5 < X, 3 >= X. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 < X, 3 >= X. | 失敗了!回索。 | |
2 | max([2, 4], X), 5 < X, 3 >= X. | 失敗了!回索。 | |
1 | max([5, 2, 4], X), 3 >= X. | 失敗了!回索。 | |
原來的查詢 | 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. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | - |
|
4 | max([], X), 4 < X, 2 >= X, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
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. | 滿足了。 | |
5 | 5 >= 2, 3 < 5. | 滿足了。 | |
6 | 3 < 5. | 滿足了! 輸出︰A = 5 跟著回索。 |
|
5 | 5 >= 2, 3 < 5. | 失敗了!回索。 | |
4 | 2 < 4, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | X = 4 | |
4 | max([], X), X >= 4, 2 < 4, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | - |
|
4 | max([], X), 4 < X, 2 < X, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
3 | max([4], X), 2 < X, 5 >= 2, 3 < 5. | 失敗了!回索。 | |
2 | max([2, 4], X), 5 >= X, 3 < 5. | 失敗了!回索。 | |
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. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | X = 4 | |
4 | max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 < 2. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | - |
|
4 | max([], X), 4 < X, 2 >= X, 5 < 2, 3 < 2. | 失敗了!回索。 | |
3 | max([4], X), 2 >= X, 5 < 2, 3 < 2. | 失敗了!回索。 | |
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. | 成功了。 | |
5 | 5 < 4, 3 < 4. | 失敗了!回索。 | |
4 | 2 < 4, 5 < 4, 3 < 4. | 失敗了!回索。 | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | A = 4 | |
4 | max([], X), 4 >= X, 2 < 4, 5 < 4, 3 < 4. | 失敗了!回索。 | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | - |
|
4 | max([], A), 4 < A, 2 < A, 5 < A, 3 < A. | 失敗了!回索。 | |
3 | max([4], A), 2 < A, 5 < A, 3 < A. | 失敗了!回索。 | |
2 | max([2, 4], A), 5 < A, 3 < A. | 失敗了!回索。 | |
1 | max([5, 2, 4], A), 3 < A. | 失敗了!回索。 | |
原來的查詢 | max([3, 5, 2, 4], A). | 失敗了!再沒有規則或事實可以應用。 | |
整體輸出 | A = 5 |