SWI-Prolog没有列表连接功能,我必须自己编写。我知道经典的解决方案,但是它不允许访问第二个列表的开头和结尾。
conc([], L, L).
conc([X|L1], L2, [X|L3]):-
conc(L1, L2, L3).
如何添加像这样向编译器提问的程序?
?- conc([_, _, _], [L | [_, _, _]], [a,b,c,d,e,f,g,h,i,j,k,l,m]).
我知道我可以用以下形式写同样的东西:
?- conc([_, _, _ | L], [_, _, _], [a,b,c,d,e,f,g,h,i,j,k,l,m]).
答案 0 :(得分:0)
类似的查询
conc([_, _, _], [L | [_, _, _]], [a,b,c,d,e,f,g,h,i,j,k,l,m]).
鉴于您正在寻找列表 L
,所以毫无意义。毕竟[L|[_,_,_]]
等同于[L,_,_,_]
,尽管后者是语法糖。
如果您正在寻找一种获取列表前面元素的方法,则可以再次使用conc/3
,例如:
conc([_,_,_], B, [a,b,c,d,e,f,g,h,i,j,k,l,m]), conc(L, [_,_,_], B).
这给了我们预期的结果:
?- conc([_,_,_], B, [a,b,c,d,e,f,g,h,i,j,k,l,m]), conc(L, [_,_,_], B).
B = [d, e, f, g, h, i, j, k, l|...],
L = [d, e, f, g, h, i, j] ;
false.
我们可以制作一个conc/4
来将列表分为三部分,例如:
conc(A, B, C, L) :-
conc(A, D, L),
conc(B, C, D).
然后像这样查询:
?- conc([_,_,_], L, [_,_,_], [a,b,c,d,e,f,g,h,i,j,k,l,m]).
L = [d, e, f, g, h, i, j] ;
false.