1

並べ替えようとしている次のようなリストがあります。

[(tim,3),(tom,4),(jane,2),(mary,3)]

降順になるように並べ替えたい:

[(tom,4),(mary,3),(tim,3),(jane,2)]

特定の番号のリストを抽出する述語があります。

extractor([],[],[],_).
extractor([(Name, Number)|List], [(Name, Number)|NewList], Extracted, Number):-
   extractor(List, NewList, Extracted, Number),
   !.
extractor([A|List], NewList,[A|Extracted], Number):-
   extractor(List, NewList, Extracted, Number).

したがって、番号を指定すると、それらの番号を持つ要素のリストが表示され、それらの要素を含まない抽出されたリストが得られます。

それから私はそれを並べ替えました。最大の数値があり、0 からその数値までループして、その数値の要素を抽出する必要があります。ソートされたリストができるまで。

numberSort([], _, 0).
numberSort(Unsorted, Sorted, HighestNumber):-
   extractor(Unsorted, Sorted, ExtractedList, Counter),
   numberSort(ExtractedList, Sorted, Counter),
   HighestNumber is 1 + Counter.
numberSort(Unsorted, Sorted, HighestNumber):-
   numberSort(Unsorted, Sorted, Counter),
   HighestNumber is 1 + Counter.

ただし、これを試してみると、無限ループを通過します。誰かが私を助けて、どこが間違っているのか教えてもらえますか? ありがとう、

4

3 に答える 3

3

まず、コードを詳しく見る前に、リレーションが何を記述すべきかを明確にしましょう。フォームのペアがあります(Name, Number)— 余談ですが、通常、Prolog コードはName-Number代わりに書くことを好みます。そして、ペアの 2 つのリスト間の関係が必要です。2 つ目は、ペアが降順の順列です。

負の数はどうですか?あなたはそのようなケースを考慮していないようです。少なくとも、あなたのプログラムには 0 が発生します[]

プログラムがループするのはなぜですか? デバッガーを使用して、何が「起こる」かを段階的に確認することをお勧めします。さて、なぜですか?やってみて!関係のない多くのことが起こっていることがわかります。次のようなを使用すると、より効果的です。

numberSort([], _, 0) :- false .
numberSort(Unsorted, Sorted, HighestNumber) :- falseextractor(Unsorted, Sorted, ExtractedList, Counter)numberSort(ExtractedList, Sorted, Counter)HighestNumber は 1 + Counterです。
numberSort(未ソート、ソート済み、HighestNumber) :-
   numberSort(Unsorted, Sorted, Counter), false ,
    HighestNumber は 1 + Counterです。

?- numberSort( [(tim,3),(tom,4),(jane,2),(mary,3)], Sorted, H)。

プログラムのこの断片はまだループしているため、元のプログラムもループしています。それ以上見る必要はありません!さらに悪いことに、プログラムはすべてのクエリに対してループします! この問題を解決するには、残りの可視部分で少なくとも何かを修正する必要があります。しばらく時間を費やした後では、これは意外に思えるかもしれませんがextractor/4、その定義に関係なく、このループが発生します。

他の問題は次のextractor/4とおりです。

| ?- extractor([(tim,3),(jane,4)], Xs, Ys, 3).
Xs = [(tim,3)],
Ys = [(jane,4)] ? ;
no
| ?- extractor([(tim,3),(jane,4)], [], Ys, 3).
Ys = [(tim,3),(jane,4)] ? ;
no

これは奇妙ではありませんか?最初のクエリは成功し (おそらく予想どおり)、2 番目のクエリは失敗するはずですが、成功します。犯人は、ルールの最後に配置したカットです。述語は不動ではありません。この述語は、カットがまったく必要ない方法で記述することをお勧めします。

于 2013-12-01T21:09:29.420 に答える
-1

CapelliC には非常に役立つ回答があり、インスタンス化の方法に問題があったと思います。numberSort 述語に問題がありました。次のようになります。

numberSort([], [], 0).
numberSort(Unsorted, Sorted, HighestNumber):-
     Counter is HighestNumber - 1,
     extractor(Unsorted, SemiSorted, ExtractedList, Counter),
     numberSort(ExtractedList, Sorting, Counter),
     append(SemiSorted, Sorting, Sorted), !.
numberSort(Unsorted, Sorted, HighestNumber):-
     Counter is HighestNumber - 1,         
     numberSort(Unsorted, Sorted, Counter).

それはうまくいくはずです。誰かが問題に気づいたら、私に知らせてください。

于 2013-12-01T20:30:28.167 に答える