Подтвердить что ты не робот

Перемешать в прологе

Я пытаюсь написать процедуру в прологе, где если L1 = [1,2,3] и L2 = [4,5,6], то L3 = [1,4,2,5,3,6]

so 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).
4b9b3361

Ответ 1

shuffle([], B, B).
shuffle([H|A], B, [H|S]) :- shuffle(B, A, S).

В таких проблемах обычно трудная часть - это не Пролог, а определение простейшего рекурсивного отношения, которое его решает.

Ответ 2

Здесь простое решение:

shuffle([], [], []).
shuffle([X|Xs], [Y|Ys], [X,Y|Zs]) :-
    shuffle(Xs,Ys,Zs).

Обобщая это, чтобы обрабатывать список неравной длины, необходимо изменить базовый регистр на:

shuffle(Xs, [], Xs).
shuffle([], Ys, Ys).

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

(Хотя я все еще думаю, что вы должны называть это flatzip или interlace вместо shuffle.)