Recursion Prolog递归未按预期停止

Recursion Prolog递归未按预期停止,recursion,prolog,Recursion,Prolog,大家好,这是我的第一篇帖子,所以如果你们对如何提问有任何建议,我会洗耳恭听。关于我的问题,我尝试使用递归对一个数字列表进行排序,我有一个my_max/2谓词,它返回列表的最大值,在返回值之后,我从列表中选择该值,然后将其添加到我的排序列表中。然后我用新列表递归 我的问题是谓词似乎可以工作并找到正确的列表,但当谓词退出时,它会将所有列表恢复到其原始状态,基本上会撤消谓词所做的所有工作。我认为这与Prolog如何回溯有关 %finds the max of a list, if the list i

大家好,这是我的第一篇帖子,所以如果你们对如何提问有任何建议,我会洗耳恭听。关于我的问题,我尝试使用递归对一个数字列表进行排序,我有一个my_max/2谓词,它返回列表的最大值,在返回值之后,我从列表中选择该值,然后将其添加到我的排序列表中。然后我用新列表递归

我的问题是谓词似乎可以工作并找到正确的列表,但当谓词退出时,它会将所有列表恢复到其原始状态,基本上会撤消谓词所做的所有工作。我认为这与Prolog如何回溯有关

%finds the max of a list, if the list is empty return int_min

my_max([],-2147483647).
my_max(L,M):-select(M,L,Rest), \+ (member(E,Rest),E>M).

%calls the my_max predicate store it in X, combines x and sorted and appends 
%it to sorted2,then it takes X out of unsorted and creates Unsorted2 then  
%recurse with unsorted2 and sorted2 should stop and output when unsorted is 
%empty or []

my_sort([],S).
%my_sort([],S):-write(S). for test    
my_sort(Unsorted,Sorted):-
   my_max(Unsorted,X),
   append(Sorted,[X],Sorted2),
   select(X,Unsorted,Unsorted2),
   my_sort(Unsorted2,Sorted2).
我添加了write,只是为了显示它对列表进行了排序。输出应该是S=[3,2,1,1]


首先,在加载您的文件时,我得到:

Warning: Singleton variables: [S]
由于基本情况:

my_sort([],S).
my_sort([],[]).
my_sort(Unsorted,Sorted):-
   my_max(Unsorted,X),
   select(X,Unsorted,Unsorted2),
   my_sort(Unsorted2,Sorted2),  %  <- continue to find the sorted sublist
   append(Sorted2,[X],Sorted).  %  <-place max at the end of sorted
问题是基本情况表明空列表与单例变量S匹配,因此请尝试:

?- my_sort([],[1,2]).
true ;
false.

?- my_sort([],hello).
true ;
false.
在这两种情况下,我的排序/2都不应成功。因此,您的基本情况应该是空列表:

my_sort([],S). 
不必在基本情况下构建完整的排序列表,您可以通过递归构建它,并在基本情况下保留一个空列表:

my_sort([],S).
my_sort([],[]).
my_sort(Unsorted,Sorted):-
   my_max(Unsorted,X),
   select(X,Unsorted,Unsorted2),
   my_sort(Unsorted2,Sorted2),  %  <- continue to find the sorted sublist
   append(Sorted2,[X],Sorted).  %  <-place max at the end of sorted
例如:

?- my_sort([4,1,3,2],L).
L = [4, 3, 2, 1] ;
false.
现在要获得升序,请使用reverse/2:

?- my_sort([4,1,3,2],L),reverse(L,L1).
L = [4, 3, 2, 1],
L1 = [1, 2, 3, 4] ;
false.

此操作只在步骤上执行,以反转列表,但仅在每次递归调用中执行一次

我不懂序言,但你的代码对我来说毫无意义。我的_sort[],S.不是说对空列表排序会产生任意结果吗?谢谢你的回答,这帮了大忙。我想知道你或其他人是否可以穿过痕迹?我对递归是如何实际发生的感到困惑?我有其他语言的经验,比如C,Java。。。但没有什么能像序言一样。不客气!!!至于你关于trace的问题,也许最好用另一个问题提问,这样更多的人会看到它,并能提供帮助。。。