从嵌套列表中提取元素
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))).
[/更新]
在以下示例查询中使用广泛可用的 meta-predicate 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] ?
我知道要从包含四个元素(例如 [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))).
[/更新]
在以下示例查询中使用广泛可用的 meta-predicate 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] ?