如何在 prolog 中创建一个包含每个元素的 prev 和 next 元素的三元组列表列表?

问题描述 投票:0回答:1

我一直在尝试从列表中取出元素并制作一个包含三个元素的列表的列表,例如:
从列表 [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], 几乎

prolog
1个回答
0
投票

一个可能的解决方案是:

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].
© www.soinside.com 2019 - 2024. All rights reserved.