Небольшой вариант элегантного метода от High Performance Mark:
Select[Tuples[{a, b, c, d}, 3], OrderedQ]
Перестановки немного более универсальны (но не то, что вы ищете?)
Например:
Select[Permutations[
Sort@Flatten@ConstantArray[{a, b, c, d}, {3}], {2, 3}], OrderedQ]
дает следующее
Edit:
Select[Tuples[Sort@{a, b, d, c}, 3], OrderedQ]
вероятно, лучше
Edit-2
Конечно, также можно использовать чехлы. Например
Cases[Permutations[
Sort@Flatten@ConstantArray[{a, b, d, c}, {3}], {2, 3}], _?OrderedQ]
Edit-3.
Два подхода будут отличаться, если список содержит повторяющийся элемент. Выход из
следующее (подход 2), например, будет содержать дубликаты (которые могут быть или не быть желательными):
Select[Tuples[{a, b, c, d, a}, 3], OrderedQ]
От них легко избавиться:
Union@Select[Tuples[{a, b, c, d, a}, 3], OrderedQ]
Следующее оценивается как «True» (удалить дубликаты элементов из списка, представленного для подхода 2, и отсортировать список, созданный в подходе 1 (метод High Performance Mark):
lst = RandomInteger[9, 50];
Select[Union@Sort@Tuples[lst, 3], OrderedQ] ==
Sort@DeleteDuplicates[Map[Sort, Tuples[lst, 3]]]
как и следующее (удалить дубликаты из вывода подхода 2, сортировать выходные данные подхода 1):
lst = RandomInteger[9, 50];
Union@Select[Sort@Tuples[lst, 3], OrderedQ] ==
Sort@DeleteDuplicates[Map[Sort, Tuples[lst, 3]]]
Извините за это!