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).
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
@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
@coder es ist fest in dna_swap/2 codiert, wo es +3 und -3 gibt. – kentilla