我正在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]).
代码现在按预期工作。
答案 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]).