Prolog Bubblesort未实例化的参数

时间:2017-04-18 15:59:17

标签: prolog bubble-sort

我正在prolog中使用bubblesort算法。以下是我到目前为止的情况:

bubblesort([],SortedList).
bubblesort([X,Y|List], [Y,X|SortedList]) :- X>Y, bubblesort(List, SortedList).
bubblesort([N|List], [N|SortedList]) :- bubblesort(List, SortedList).

bubble(List, SortedList) :- bubblesort(List, Sorted),
                         ( check(Sorted)
                         -> SortedList=Sorted
                         ; bubble(Sorted, SortedList) ).
check([]).
check([X,Y|SortedList]) :- X<Y, check(SortedList).

我通过此调用测试此函数:

bubble([2, 11, -4, 6, 8, 10101, 61, -98, 55, 79, -32, -67, 54, 45, 19, 707, 43, -99, 32, 20], List).

第一次排序,它工作正常。但是,当它尝试对第一个结果进行排序时,会发生以下错误:

猭ERROR: >/2: Arguments are not sufficiently instantiated
   Exception: (21) bubblesort([32|_G3208], _G3265) ? creep
   Exception: (19) bubblesort([707, -99, 20, 32|_G3208], _G3256) ? creep
   Exception: (17) bubblesort([54, 19, 43, 707, -99, 20, 32|_G3208], _G3247) ? creep
   Exception: (15) bubblesort([79, -67, 45, 54, 19, 43, 707, -99|...], _G3238) ? creep
   Exception: (14) bubblesort([55, -32, 79, -67, 45, 54, 19, 43|...], _G3232) ? creep
   Exception: (13) bubblesort([10101, -98, 55, -32, 79, -67, 45, 54|...], _G3226) ? creep
   Exception: (10) bubblesort([11, 6, 8, 61, 10101, -98, 55, -32|...], _G3214) ? creep
   Exception: (9) bubblesort([2, -4, 11, 6, 8, 61, 10101, -98|...], _G3309) ? creep

跟踪程序会显示此次调用时:

Call: (21) bubblesort([32|_G5214], _G5271) ? creep
Call: (22) 32>_G5273 ? creep

出现错误消息。我不明白这个调用是如何进行的,因为我的列表中不应该有未经证实的值。我做错了什么?

编辑: 我稍微修改了代码:

bubblesort([],[]).
bubblesort([X,Y|List], [Y,X|SortedList]) :- X>Y, bubblesort(List, SortedList).
bubblesort([N|List], [N|SortedList]) :- bubblesort(List, SortedList).

bubble(List, SortedList) :- bubblesort(List, Sorted),
                         ( check(Sorted)
                         -> SortedList=Sorted
                         ; bubble(Sorted, SortedList) ).
check([]).
check([X,Y|SortedList]) :- X<Y, check(SortedList).

我有以下输出: 列表= [-4,2,-98,6,-32,8,-67,11,45 | ...]

这个输出是错误的,我知道为什么这是输出。检查测试前两个,然后移动到接下来的两个,这是不可取的。我正在修理检查。

编辑2:

我修改了检查方法:

check([]).
check([_]).
check([X,Y|SortedList]) :- X<Y, check([Y|SortedList]).

代码现在按预期工作。

1 个答案:

答案 0 :(得分:0)

这是最终的代码。请参阅上文,了解我如何得出自己问题的答案:

bubblesort([],[]).
bubblesort([X],[X]).
bubblesort([X,Y|List], [Y,X|SortedList]) :- X>Y, bubblesort(List, SortedList).
bubblesort([N|List], [N|SortedList]) :- bubblesort(List, SortedList).

bubble(List, SortedList) :- bubblesort(List, Sorted),
                         ( check(Sorted)
                         -> SortedList=Sorted
                         ; bubble(Sorted, SortedList) ).
check([]).
check([_]).
check([X,Y|SortedList]) :- X<Y, check([Y|SortedList]).