2017-04-18 7 views
0

私はプロローグで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]). 

今意図したとおりのコードが動作します。

答えて

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]). 
関連する問題