从嵌套列表中提取元素

Extracting element from nested lists

我知道要从包含四个元素(例如 [1,2,3,4])的简单列表中提取第三个元素,我会按如下方式进行。

third([_,_,E,_], E).

我想从一组嵌套列表中提取第三个元素。例如,如果我有 [[1,2,3,4],[5,6,7,8],[9,10,11,12]],我想要输出 [3,7,11] .

如有任何帮助,我们将不胜感激。

我的猜测:

third([], []) :- !.
third([[_, _, E|_]|Rest], [E|R]) :- third(Rest, R).

我知道有些人不喜欢 cut (!),但这对我来说足够了。


[2016-03-14更新]

更强大的版本:

third([], []).
third([Xs|Rest], R) :-
    length(Xs, Len),
    (Len < 3 -> third(Rest, R);
                (Xs = [_, _, E|_],
                 R = [E|R1],
                 third(Rest, R1))).

[/更新]

在以下示例查询中使用广泛可用的 maplist/3

?- maplist(third, [[1,2,3,4],[5,6,7,8],[9,10,11,12]], Xs).
Xs = [3, 7, 11].

当然,@repeat (maplist predicat) 的解决方案是优雅的答案 然而,这是一个最简单的答案:

版本 1:

third_([], []).
third_([List|Rest], [R|Res]) :-
        third(List, R),
        third_(Rest, Res).

版本 2

third_([], []).
third_([[_,_,R,_]|Rest], [R|Res]) :-
        third_(Rest, Res).

测试:

| ?- third_(Xs,Res).
Xs = [],
Res = [] ? ;
Xs = [[_A,_B,_C,_D]],
Res = [_C] ? ;
Xs = [[_A,_B,_C,_D],[_E,_F,_G,_H]],
Res = [_C,_G] ? ;
Xs = [[_A,_B,_C,_D],[_E,_F,_G,_H],[_I,_J,_K,_L]],
Res = [_C,_G,_K] ?