Перемешать в прологе
Я пытаюсь написать процедуру в прологе, где, если L1 = [1,2,3] и L2 = [4,5,6], то L3 = [1,4,2,5,3,6]
так shuffle([1,2,3],[4,5,6],[1,4,2,5,3,6])
У меня есть это до сих пор:
shuffle([X],[Y],[X,Y]).
shuffle([X|Xs],[Y|Ys],_) :- shuffle(Xs,Ys,Z), shuffle(X,Y,Z).
Это моя первая попытка написания прологического кода, поэтому я все еще пытаюсь разобраться в синтаксисе, правилах и прочем.
Я понимаю логику, я просто не уверен, как это реализовать, поэтому любая помощь будет принята с благодарностью!
Спасибо!
Редактировать: я понял это. Вот решение, если кому-то интересно:
shuffle([X],[Y],[X,Y]).
shuffle([X|Xs],[Y|Ys],[Z1,Z2|Zs]) :- shuffle([X],[Y],[Z1,Z2]),shuffle(Xs,Ys,Zs).
2 ответа
shuffle([], B, B).
shuffle([H|A], B, [H|S]) :- shuffle(B, A, S).
В таких задачах обычно трудной частью является не Пролог, а определение самой простой рекурсивной связи, которая ее решает.
Вот простое решение:
shuffle([], [], []).
shuffle([X|Xs], [Y|Ys], [X,Y|Zs]) :-
shuffle(Xs,Ys,Zs).
Обобщая это для обработки списка неравной длины, нужно изменить базовый вариант на:
shuffle(Xs, [], Xs).
shuffle([], Ys, Ys).
хотя это может привести к дублированию решений. Они могут быть исправлены с помощью сокращения, если вы не возражаете против того, чтобы предикат был "односторонним".
(Хотя я все еще думаю, что вы должны назвать это flatzip
или же interlace
вместо shuffle
.)