使用Prolog中的以下代码片段,我设法从列表中提取每个第三项:
third([_,_,Z|L], Z).
third([_,_,C|L], Y) :-
third(L, Y).
Run Code Online (Sandbox Code Playgroud)
但是,我仍然需要将我正在提取的每个项目追加到一个新列表中,最后创建一个只包含" 每三个 "项目的列表.我会感激任何提示或帮助!谢谢.
这样做怎么样?
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)