Sorting 序言泡泡运动

Sorting 序言泡泡运动,sorting,prolog,Sorting,Prolog,我正试图最好地理解这段代码的所有内容。这就是我目前对正在发生的事情的看法: 因此,我可以看到如果X>Y我们交换元素,如果不交换,我们将沿着子列表递归,直到找到X的Y,如果不交换,则对列表进行排序。 我遇到的问题是我不太理解基本情况,bubblesort(Sorted,Sorted)。我以为你需要一个空列表的基本案例?如果有人能描述一下这个项目的一步一步的描述,我将不胜感激 bubblesort(List,Sorted) :- swap(List,List1), !, bubbl

我正试图最好地理解这段代码的所有内容。这就是我目前对正在发生的事情的看法:

因此,我可以看到如果
X>Y
我们交换元素,如果不交换,我们将沿着子列表递归,直到找到
X
Y
,如果不交换,则对列表进行排序。 我遇到的问题是我不太理解基本情况,
bubblesort(Sorted,Sorted)
。我以为你需要一个空列表的基本案例?如果有人能描述一下这个项目的一步一步的描述,我将不胜感激

bubblesort(List,Sorted) :-
   swap(List,List1),
   !,
   bubblesort(List1,Sorted).
bubblesort(Sorted,Sorted).

swap([X,Y|Rest],[Y,X|Rest]) :-   % swaps X with Y if gt(X,Y) is true.
   gt(X,Y).
swap([Z|Rest],[Z|Rest1]) :-      % calls swap on sublists excluding the heads.
   swap(Rest,Rest1).

gt(X,Y) :-                       % true if X is greater than Y.
   X > Y.

基本情况的可能重复不会使用空列表,因为参数在递归中不会减少为空列表。递归传递列表时,列表的长度始终相同。基本案例并不总是空列表案例或零案例。此外,在
bubblesort
谓词中,只有当第一个子句中的
swap
失败时,才会出现基本情况,这意味着排序完成,您的解决方案是
列表本身,因此
bubblesort(排序,排序).
@false提供的链接提供了对谓词更详细的分析。因此,如果第一个swap子句失败,那么它将跳过bubblesort(列表1,排序)。行并转到bubblesort(排序,排序)?是的,完全正确。这在Prolog中称为“回溯”。谓词的多次出现(“子句”)有点像逻辑上的“OR”。如果一个表达式失败,那么Prolog将尝试下一个表达式(因为在第一个表达式中没有剩余的内容可以尝试,所以
swap
是第一个子句中的第一个表达式)。swap([Z | Rest],[Z | Rest1]):-swap(Rest,Rest1)。如果列表的长度为0或1,这行是否会失败,因为您无法将其拆分为头和尾?