使用第二个元素作为轴心的Prolog快速排序

使用第二个元素作为轴心的Prolog快速排序,prolog,pivot,quicksort,Prolog,Pivot,Quicksort,我一直在学习prolog,我想使用列表的第二个元素作为快速排序的轴心 我原以为在方法中使用[Head |[Pivot | Tail]]作为输入会起作用,但后来我不确定第一个元素“Head”可以放在哪里 像这样: qsort([],[]):- !. qsort([Head|[Pivot|Tail]],Sorted):- split(Pivot,[Head|Tail],Less,Greater), qsort(Less,SortedLess), qso

我一直在学习prolog,我想使用列表的第二个元素作为快速排序的轴心

我原以为在方法中使用[Head |[Pivot | Tail]]作为输入会起作用,但后来我不确定第一个元素“Head”可以放在哪里

像这样:

qsort([],[]):- !.
qsort([Head|[Pivot|Tail]],Sorted):-
        split(Pivot,[Head|Tail],Less,Greater),
        qsort(Less,SortedLess),
        qsort(Greater,SortedGreater),
        append(SortedLess,[Pivot|SortedGreater],Sorted).
split(_,[],[],[]).
split(Pivot,[X|T],[X|Less],Greater):-
        X=<Pivot,split(Pivot,T,Less,Greater).
split(Pivot,[X|T],Less,[X|Greater]):-
        X>Pivot,split(Pivot,T,Less,Greater).
qsort([],[]):-!。
qsort([Head |[Pivot | Tail]],已排序):-
拆分(枢轴、[头|尾]、较小、较大),
qsort(较少,无分拣),
qsort(更大,分类创建器),
追加(无分拣,[Pivot | SortedCreate],已分拣)。
拆分(u,[],[],[])。
拆分(枢轴、[X | T]、[X |小于]、更大):-
X=支点,拆分(支点,T,较小,较大)。
但是,当我尝试使用
qsort([8,3,4,12,25,4,6,1,9,22,6]排序)对列表排序时,
只会返回false。我做错了什么

但是,当我尝试使用
qsort对列表排序时([8,3,4,12,25,4,6,1,9,22,6],已排序)
。它只是返回false。我做错了什么

最终,该算法将使用一个只包含一个元素的列表进行调用,并且您没有定义一个与该列表匹配的
qsort/2
子句

您可以通过添加规则来解决此问题:

qsort([],[]).
qsort([X], [X]).
qsort([Head, Pivot|Tail],Sorted):-
        split(Pivot,[Head|Tail],Less,Greater),
        qsort(Less,SortedLess),
        qsort(Greater,SortedGreater),
        append(SortedLess,[Pivot|SortedGreater],Sorted).

您不考虑使用一个元素对列表进行排序。该列表将与
[Head |[Pivot | Tail]]
不匹配。非常感谢你!这是我在这个网站上的第一个问题;你们真是帮了大忙!
?- qsort([8, 3, 4, 12, 25, 4, 6, 1, 9, 22, 6], Sorted).
Sorted = [1, 3, 4, 4, 6, 6, 8, 9, 12|...] ;
false.