私はプロローグでbubblesortアルゴリズムを使用しています。ここで私はこれまで持っているものです。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).
I有し、次の出力: 一覧= -4、2、-98、6、-32、8、-67、11、 45 | ...]
この出力は誤りで、なぜこれが出力であるのか分かります。チェックは最初の2つをテストし、次の2つに移動するなどは望ましくありません。私はチェックのための修正に取り組んでいます。
編集2:
私は、チェック方法を改定:
check([]).
check([_]).
check([X,Y|SortedList]) :- X<Y, check([Y|SortedList]).
今意図したとおりのコードが動作します。