1
Я ищу компактный предикат для подкачки подстановок фиксированной длины в более крупном списке. Например, если подсписки имеют размер 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).
Как длина подсписков В вашем примере [a, t, t, g, c, c] вы передали информацию, которая подсвечивает hav e length 3?, если у вас есть [a, t, t, g, c, c, a, b, c], который имеет 3 подвыражения длины 3, как вы их обмениваете? – coder
@kentilla - (мало) очевидное semplification отменяет 'Xs' и использует' Xe' ('между (Xe, Size, Y)'), но ... эта инструкция ... не должна быть 'между (между Xe, Limit, Y) '? – max66
@coder жестко закодирован в dna_swap/2, где есть +3 и -3. – kentilla