列表

前頁 目錄

頭和尾 例子

列表是一個按序排列的物件及列表。在 Prolog 中,列表以一對方括號包著以逗號分隔的元素。例如︰

[] 空的列表。
[peter, 4, abc, X] 這列表內有四個元素。列表內變量和常數的數目並沒有限制。
[a, b, [c, d], e] 這列表內有四個元素,其中第三個元素是一個列表。這個例子說明一個列表也可以成為另一列表的元素。

頭和尾 Top

一個列表的就是列表的第一個元素,而列表的就是移除了第一個元素後剩下的列表。例如︰

列表
[] 未定義 未定義
[a] a []
[a, b] a [b]
[[a, b], c] [a, b] [c]
[[a, b], [c, d]] [a, b] [[c, d]]

如果 X 和 Y 分別是一個列表的頭和尾,該列表可以寫成 [X | Y。試看看以下例子。

例子 Top

假設以下程序被查閱︰

程序五︰一個和列表有關的程序
head([H | T], H).                     /* R1 */
tail([H | T], T).                     /* R2 */
list([H | T], H, T).                  /* R3 */

max([H], H).                          /* R4 */
max([H | T], H) :- max(T, X), H >= X. /* R5 */
max([H | T], X) :- max(T, X), H < X.  /* R6 */

求出頭和尾

以下查詢使用了事實 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).

R5

A = 3
1 max([5, 2, 4], X), 3 >= X.

R5

X = 5
2 max([2, 4], X), 5 >= X, 3 >= 5.

R5

X = 2
3 max([4], X), 2 >= X, 5 >= 2, 3 >= 5.

R4

X = 4
4 2 >= 4, 5 >= 2, 3 >= 5. 失敗了!回索。
3 max([4], X), 2 >= X, 5 >= 2, 3 >= 5.

R5

X = 4
4 max([], X), 2 >= 4, 5 >= 2, 3 >= 5. 失敗了!回索。
3 max([4], X), 2 >= X, 5 >= 2, 3 >= 5.

R6

-

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.

R6

-

3 max([4], X), 2 < X, 5 >= X, 3 >= 5.

R4

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.

R6

-

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.

R6

-

2 max([2, 4], X), 5 < X, 3 >= X.

R5

X = 2
3 max([4], X), 2 >= X, 5 < 2, 3 >= 2.

R4

X = 4
4 2 >= 4, 5 < 2, 3 >= 2. 失敗了!回索。
3 max([4], X), 2 >= X, 5 < 2, 3 >= 2.

R5

X = 4
4 max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 >= 2. 失敗了!回索。
3 max([4], X), 2 >= X, 5 < 2, 3 >= 2.

R6

-

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.

R6

-

3 max([4], X), 2 < X, 5 < X, 3 >= X.

R4

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.

R5

X = 4
4 max([], X), 2 < 4, 5 < 4, 3 >= 4. 失敗了!回索。
3 max([4], X), 2 < X, 5 < X, 3 >= X.

R6

-

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).

R6

-

1 max([5, 2, 4], A), 3 < A.

R5

A = 5
2 max([2, 4], X), 5 >= X, 3 < 5.

R5

X = 2
3 max([4], X), 2 >= X, 5 >= 2, 3 < 5.

R4

X = 4
4 2 >= 4, 5 >= 2, 3 < 5. 失敗了!回索。
3 max([4], X), 2 >= X, 5 >= 2, 3 < 5.

R5

X = 4
4 max([], X), 4 >= X, 2 >= 4, 5 >= 2, 3 < 5. 失敗了!回索。
3 max([4], X), 2 >= X, 5 >= 2, 3 < 5.

R6

-

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.

R6

-

3 max([4], X), 2 < X, 5 >= X, 3 < 5.

R4

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.

R5

X = 4
4 max([], X), X >= 4, 2 < 4, 5 >= 2, 3 < 5. 失敗了!回索。
3 max([4], X), 2 < X, 5 >= 2, 3 < 5.

R6

-

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.

R6

-

2 max([2, 4], A), 5 < A, 3 < A.

R5

A = 2
3 max([4], X), 2 >= X, 5 < 2, 3 < 2.

R4

X = 4
4 2 >= 4, 5 < 2, 3 < 2. 失敗了!回索。
3 max([4], X), 2 >= X, 5 < 2, 3 < 2.

R5

X = 4
4 max([], X), 4 >= X, 2 >= 4, 5 < 2, 3 < 2. 失敗了!回索。
3 max([4], X), 2 >= X, 5 < 2, 3 < 2.

R6

-

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.

R6

-

3 max([4], A), 2 < A, 5 < A, 3 < A.

R4

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.

R5

A = 4
4 max([], X), 4 >= X, 2 < 4, 5 < 4, 3 < 4. 失敗了!回索。
3 max([4], A), 2 < A, 5 < A, 3 < A.

R6

-

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

前頁 目錄