Я написал предикат, shuffle/3
, который генерирует "перетасовки" из двух списков. Когда второй и третий аргументы создаются, первый аргумент становится списком, который имеет все элементы как слева, так и справа, в том же порядке, в котором они отображаются слева и справа.
Например:
?- shuffle(X, [1, 2], [3, 4]).
X = [1, 3, 2, 4] ;
X = [1, 3, 4, 2] ;
X = [1, 2, 3, 4] ;
X = [3, 4, 1, 2] ;
X = [3, 1, 2, 4] ;
X = [3, 1, 4, 2] ;
false.
Вот код, который я придумал для его реализации:
shuffle([], [], []).
shuffle([H|R], [H|Left], Right) :- shuffle(R, Right, Left).
shuffle([H|R], Left, [H|Right]) :- shuffle(R, Right, Left).
Это хорошо работает и даже дает разумные результаты для "самого общего запроса", но не может быть детерминированным для любого запроса, даже если все аргументы полностью созданы: shuffle([1, 2, 3, 4], [1, 2], [3, 4])
.
Мой реальный вопрос: есть ли что-нибудь, что я могу сделать, сохраняя чистоту (так, никаких сокращений), что делает этот предикат детерминированным, когда все аргументы полностью инстанцируются?
И пока я здесь, я новичок в Prolog, мне интересно, есть ли у кого-нибудь совет, почему я буду заботиться о детерминизме. Это важно для реальных пролог программ?