我一直在尝试从列表中取出元素并制作一个包含三个元素的列表的列表,例如:
从列表 [1,2,3,4] 中,结果将是 [[null,1,2],[1,2,3],[2,3,4],[3,4,null]]。
但我无法获取列表的头部或末尾,我只能获取 [[1,2,3],[2,3,4],[3,4,null]] 或 [[空,1,2],[1,2,3],[2,3,4]]。 这是功能:
take_with_neighbors([X|Xs], Result) :-
take_with_neighbors(Xs, X, Result).
take_with_neighbors([X|Xs], Prev, [[Prev,X,Next]|Result]) :-
take_with_neighbors(Xs, X, Result),
( Xs = [Next|_] ; Next = null ).
take_with_neighbors([], _, []).
返回:[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,null]],没有 [null ,1,2]
还有这个功能:
get_adjacent_elements_helper([Primero|T], Result) :-
get_adjacent_elements_helper(null, Primero, T, Result).
get_adjacent_elements_helper(_, Primero, [], [Primero, null]) :- !.
get_adjacent_elements_helper(Prev, Primero, [Next|T], Result) :-
Result = [[Prev, Primero, Next] | Rest],
get_adjacent_elements_helper(Primero, Next, T, Rest).
这会返回 [[null,1,2],[1,2,3],[2,3,4],[3,4,5],[4,5,6],6,null], 几乎
一个可能的解决方案是:
triplets(List, Triplets) :-
triplets_helper([null|List], Triplets). % insert null at beginning
triplets_helper([X1,X2], [[X1,X2,null]]) :- !. % insert null at the end
triplets_helper([X1,X2,X3|Xs], [[X1,X2,X3]|Ys]) :-
triplets_helper([X2,X3|Xs], Ys).
例子:
?- triplets([1,2,3,4], T).
T = [[null, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, null]].
?- triplets([1,2,3], T).
T = [[null, 1, 2], [1, 2, 3], [2, 3, null]].
?- triplets([1,2], T).
T = [[null, 1, 2], [1, 2, null]].
?- triplets([1], T).
T = [[null, 1, null]].
?- triplets([], T).
false.
?- triplets(L, [[null, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, null]]).
L = [1, 2, 3, 4].