我並不完全確定要在這裏做什麼。例如,split(5, [1,2,3,4,5])
應該做什麼?對於這個問題,假設輸入列表被排序是否安全?我會假設如此。
規則split/2
的基本問題是您沒有任何輸出參數。 Prolog的工作方式與大多數編程語言不同;沒有return
這樣的東西。起初,這感覺像是一個嚴重的限制,但Prolog實際上允許你「返回」儘可能多的結果。看看這段代碼,在我看來你已經完成了一半的理解,因爲你有split/2
,它似乎沒有任何輸出參數,但它調用了split/4
,它有你需要的兩個輸出參數。
對於初學者,我放棄了split/2
的想法,並試圖讓split/4
工作。你有什麼不看起來太瘋狂:
?- split(2, [1,2,3,4,5], X, Y).
X = [1, 2],
Y = [3, 4, 5] .
?- split(5, [1,2,3,4,5], X, Y).
X = [1, 2, 3, 4, 5],
Y = [] .
?- split(1, [1,2,3,4,5], X, Y).
X = [1],
Y = [2, 3, 4, 5] .
這表明你的大部分規則是正確的。當你遇到麻煩是與其他解決方案:
?- split(2, [1,2,3,4,5], X, Y).
... ;
2 [3,4,5]
X = [1, 2|_G317] ;
false.
?- split(5, [1,2,3,4,5], X, Y).
... ;
5 []
X = [1, 2, 3, 4, 5|_G326] ;
false.
?- split(1, [1,2,3,4,5], X, Y).
... ;
1 [2,3,4,5]
X = [1|_G314].
您可以從寫作對那裏由您的最後一個規則,X = Y, write(Y)...
等產生這些額外的解決方案,只需刪除該規則看生產中所需的行爲split/4
。
繼續前進,我想可能不是split/2
你實際上想要的是split/3
帶有一個輸出參數列表的列表。它不會是太難基礎上,我們至今產生:
split(X, List, [Before, After]) :- split(X, List, Before, After).
運行它,我們看到我們得到你所提到的期望的結果:
?- split(3, [1,2,3,4,5], X).
X = [[1, 2, 3], [4, 5]] ;
false.
?- split(1, [1,2,3,4,5], X).
X = [[1], [2, 3, 4, 5]] ;
false.
?- split(5, [1,2,3,4,5], X).
X = [[1, 2, 3, 4, 5], []] ;
false.
希望這有助於!