Prolog:获取并将列表中的每个第三项附加到新列表

J. *_*st. 1 list prolog

使用Prolog中的以下代码片段,我设法从列表中提取每个第三项:

third([_,_,Z|L], Z).    
third([_,_,C|L], Y) :-
   third(L, Y).
Run Code Online (Sandbox Code Playgroud)

但是,我仍然需要将我正在提取的每个项目追加到一个新列表中,最后创建一个只包含" 每三个 "项目的列表.我会感激任何提示或帮助!谢谢.

rep*_*eat 5

这样做怎么样?

list_thirds([]        , []).
list_thirds([_]       , []).
list_thirds([_,_]     , []).
list_thirds([_,_,E|Es], [E|Xs]) :-
   list_thirds(Es, Xs).
Run Code Online (Sandbox Code Playgroud)

使用SICStus Prolog 4.3.2进行示例查询:

| ?- list_thirds([], Xs).
Xs = [] ? ;
no

| ?- list_thirds([a,b,c], Xs).
Xs = [c] ? ;
no

| ?- list_thirds([a,b,c,d,e,f], Xs).
Xs = [c,f] ? ;
no

| ?- list_thirds([a,b,c,d,e,f,g], Xs).
Xs = [c,f] ? ;
no
Run Code Online (Sandbox Code Playgroud)

走向"其他方向"怎么样?

| ?- list_thirds(List, [x,y]).
List = [_A,_B,x,_C,_D,y]       ? ;
List = [_A,_B,x,_C,_D,y,_E]    ? ;
List = [_A,_B,x,_C,_D,y,_E,_F] ? ;
no                                     % terminates universally
Run Code Online (Sandbox Code Playgroud)

最后,我们来看看我们从最常见的查询得到的答案序列:

| ?- list_thirds(Es, Xs).
Es = []                 , Xs = []      ? ;
Es = [_A]               , Xs = []      ? ;
Es = [_A,_B]            , Xs = []      ? ;
Es = [_A,_B,_C]         , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D]      , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E]   , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E,_F], Xs = [_C,_F] ? ;
...
Run Code Online (Sandbox Code Playgroud)