我知道要从包含四个元素的简单列表中提取第三个元素,如[1,2,3,4],我会这样做。
third([_,_,E,_], E).
我想从一组嵌套列表中提取第三个元素。例如,如果我有[[1,2,3,4],[5,6,7,8],[9,10,11,12]],我希望输出[3,7,11] 。
非常感谢任何帮助。
答案 0 :(得分:2)
在以下示例查询中使用广泛可用的meta-predicate 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] ?