从嵌套列表中提取元素

时间:2016-03-13 00:27:26

标签: list prolog nested-lists

我知道要从包含四个元素的简单列表中提取第三个元素,如[1,2,3,4],我会这样做。

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我的猜测:

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

我知道有些人不喜欢剪切(!),但这对我来说听起来不够。

[更新2016-03-14]

robuster版本:

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

[/更新]

答案 2 :(得分:0)

当然,@ 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] ?