2016-09-14 6 views
1

Ich suche nach einem kompakten Prädikat, um Unterlisten fester Länge in einer größeren Liste zu tauschen. Zum Beispiel, wenn Sublisten Größe 3 dannSublisten in Prolog tauschen

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

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

wird ich mit folgendem Programm endete:

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

Es scheint zu funktionieren. Zum Beispiel kann die folgende Abfrage:

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

Ermittelt die richtige Antwort in L.

Wie auch immer, wie Sie sehen können, ist es sehr ausführlich ist. Gibt es einen besseren Weg?

bearbeiten

Dieses viel besser zu funktionieren scheint:

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). 
+3

Wie ist die Länge der Sublisten In Ihrem Beispiel [a, t, t, g, c, c] haben Sie die Informationen weitergegeben, die Unterlisten haben e Länge 3 Wenn du [a, t, t, g, c, c, a, b, c] hast, die 3 Unterlisten der Länge 3 haben, wie tauscht man sie aus? – coder

+0

@kentilla - eine (kleine) naheliegende Semification ist 'Xs' abzuschaffen und' Xe' ('between (Xe, Size, Y)') zu verwenden, aber ... diese Anweisung ... sollte nicht 'between (Xe, Grenze, Y) '? – max66

+0

@coder es ist fest in dna_swap/2 codiert, wo es +3 und -3 gibt. – kentilla

Antwort

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

Hoffnung ist das, was Sie suchen:

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