2015-10-21 127 views
2

我是Prolog的初學者,我試着寫出從列表前面取n個元素時謂詞成立的謂詞。這是我寫的,它似乎並沒有工作:
take(N, List, Front):- length(Front, N), append(Front, [], List). 我認爲對於拿(N,列表,前)保持真實,列表和前臺必須是相同的列表,這意味着append(Front, [], List)必須成立, Front必須大小爲N,因此length(Front, N)必須成立。從Prolog的列表前面取n個元素


現在,當我嘗試這樣的解釋,我得到如下:
29 ?- take(5, [1,2,3,4,5], Polo).
Polo = [1, 2, 3, 4, 5]
30 ?- take(3, [1,2,3,4,5], Ok).
false.

回答

2

如果你想利用N元素從List前,這就像從List的尾部前端取N - 1個元素,加入了List的負責人。毫不奇怪,從任何東西中取0個元素都是一個空列表。 (請記住,您可以將List解構爲[Head | Tail]。)

編輯:爲什麼take(N, List, Front):- length(Front, N), append(Front, _, List).工作?

因爲lengthappend都做了類似上述的事情。 length(Front, N)將使Front[F1, F2, F3... FN],其中N未知。 _可以是任何東西,所以它可以是一些未知的列表。然後append(Front, _, List)去連接兩個未知的列表,並將連接的每個元素等同於List的元素。舉例來說,如果你有N爲2,List[1, 2, 3, 4, 5],然後append(Front, _, List)將確保[F1, F2, U1, U2, U3]比賽List

append([F1, F2], _, [1, 2, 3, 4, 5])斷言F1 = 1append([F2], _, [2, 3, 4, 5])。這斷言F2 = 2append([], _, [3, 4, 5])。這又是append的突破條件,其斷言_ = [3, 4, 5],這是平凡的。所以Front = [F1, F2] = [1, 2]

length構建[F1, F2]的方式類似:length(First, 2)斷言length(FirstTail, 1),而這個斷言length(FirstTailTail, 0),這是休息狀態,所以FirstTailTail = [],這使得First = [F1 | [F2 | []]] = [F1, F2]

+0

謝謝,肯定會工作,但由於某種原因,如果我改變採取(N,列表,前): - 長度(前,N),追加(前,[],列表)。 (N,List,Front): - 長度(Front,N),追加(Front,_,List)。它工作正常。有人可以解釋爲什麼。 – killuminati

+0

我的意思是這個:取(N,List,Front): - 長度(Front,N),追加(Front,_,List)。 – killuminati

+0

感謝您的解釋,它使得它更清晰。 – killuminati