2016-09-14 8 views
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). 
+3

Как длина подсписков В вашем примере [a, t, t, g, c, c] вы передали информацию, которая подсвечивает hav e length 3?, если у вас есть [a, t, t, g, c, c, a, b, c], который имеет 3 подвыражения длины 3, как вы их обмениваете? – coder

+0

@kentilla - (мало) очевидное semplification отменяет 'Xs' и использует' Xe' ('между (Xe, Size, Y)'), но ... эта инструкция ... не должна быть 'между (между Xe, Limit, Y) '? – max66

+0

@coder жестко закодирован в dna_swap/2, где есть +3 и -3. – kentilla

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^