在prolog中交换子列表

时间:2016-09-14 05:49:05

标签: prolog swap sublist

我正在搜索紧凑谓词,以便在更大的列表中交换固定长度的子列表。例如,如果子列表的大小为3,那么

[a,t,t,g,c,c]

变为

[g,c,c,a,t,t]

我最终得到了以下程序:

dna_sub(A,B,X,Xe) :-
    append(A1,_,A),
    length(A1,Xe),
    append(B1,B,A1),
    length(B1,X).

dna_swap(A,B,X,Xe,Y,Ye) :-
    length(A, Size),
    dna_sub(A,Part1, 0, X),
    dna_sub(A,Part2, X, Xe),
    dna_sub(A,Part3, Xe, Y),
    dna_sub(A,Part4, Y, Ye),
    dna_sub(A,Part5, Ye, Size),
    append(Part1, Part4, Tmp),
    append(Tmp, Part3, Tmp2),
    append(Tmp2, Part2, Tmp3),
    append(Tmp3, Part5, B).

dna_swap(A,B) :-
    length(A, Size),
    Limit is Size - 3,
    between(0,Limit, X),
    Xe is X + 3,
    Xs is Xe,
    between(Xs, Size, Y),
    Ye is Y + 3,
    dna_swap(A,B,X,Xe,Y,Ye).

似乎工作正常。例如,以下查询:

dna_swap([t,a,g,t,g,c], L).

在L中获得正确的答案。

无论如何,正如你所看到的,它非常冗长。还有更好的方法吗?

修改

这看起来好多了:

dna_swap(A,B) :-
    append(Left1, [X1,X2,X3|Right1], A),
    append(Left2, [Y1,Y2,Y3|Right2], Right1),
    append(Left1, [Y1,Y2,Y3|Left2], Tmp),
    append(Tmp, [X1,X2,X3|Right2], B).

1 个答案:

答案 0 :(得分:1)

sublists(List,Count,A,B) :-
    length(A,Count),
    append(A,B,List).

swap(List,Count,SwappedList) :-
    sublists(List,Count,A,B),
    append(B,A,SwappedList).

希望这就是你要找的东西:

4 ?- swap([a,b,c,d],2,S).
S = [c, d, a, b].