如何改善字符串连接的解决方案?

时间:2019-07-13 14:58:50

标签: prolog

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]).

1 个答案:

答案 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.