предикат поворота; Как вы добавляете подсписок перевернутых элементов к списку?

#prolog

#пролог

Вопрос:

turn 3 принимает два списка в качестве входных данных, исходный и переключаемый. Когда элемент является членом переключателя, он меняет порядок для всех элементов после. Я хочу знать, как изменить порядок частей списка на обратный, определяемый переключением определенного набора элементов. Примером того, как это будет работать, является :

 ?- turn([1,2,3,4,5],[3],L). 
L = [3, 2, 1, 4, 5].

?- turn([1,b,3,5,hello,5,7,z],[5,b,a],L). 
L = [b, 1, 3, 5, 5, hello, 7, z].
  

Вот что у меня есть в данный момент, однако, похоже, что он выполняет обратное тому, что я хочу, поскольку он обычно запускает список, а затем переворачивает последующие элементы.

 turn([],_,[]).
turn([H|T], L2, L) :-
   (   member(H, L2) ->
       L = [Reversed|H],
       reverse(Ln, Reversed),
       turn(T,L2, Ln);
   L = [H|L1],
   turn(T, L2, L1)).
  

Результат таков:

 ?- turn([1,2,3,4,5],[3], L).
L = [1,2,3,5,4].
  

Комментарии:

1. Ваши фактические результаты, похоже, на самом деле идеально соответствуют описанию. В вашем описании говорится, что, .,,. С таким описанием я бы ожидал, что turn([1,2,3,4,5],[3],L). результатом будет L = [1,2,3,5,4] , а не L = [3,2,1,4,5] . Если вы хотите, L = [3,2,1,4,5] тогда о писание должно быть таким: Когда элемент вставляется в элемент переключения, он меняет порядок для всех элементов перед .

2. Спасибо. Чтобы указать, все элементы первого списка меняются местами, пока не встретится элемент, который находится во втором списке. Все элементы после этого элемента включаются в список результатов в неизменном порядке. Когда встречается другой элемент первого списка, который также находится во втором списке, элементы первого списка снова меняются местами.

3. Вам следует отредактировать свой вопрос, чтобы изменить описание. Написанный вами код соответствует исходному описанию проблемы. Кроме того, что происходит, когда более одного элемента первого списка являются членами списка переключения? Это менее тривиальный пример, который вам нужно показать, чтобы проблема была более понятна.