私はPrologで独自のソートルールを作成しようとしていますが、多くの試行錯誤の後で、を押したとき以外は動作させることができました。スウィープでは、私のリストの最後の値をリストに追加します。次のようにPrologがセミコロンの後で私のリストの最後の値を繰り返すのはなぜですか?
使用されるコードは次のとおりです。
分は、リスト内の最小値を検出し、それを
min([H|[]],H).
min([H|T],Min) :-
min(T,CurrentMin),
H < CurrentMin,
Min = H.
min([H|T],Min) :-
min(T,CurrentMin),
CurrentMin =< H,
Min = CurrentMin.
を返す削除は、リストで削除したい要素を見つけ、とのリストを返します。要素が昇順にソートされたリストを作成するために、上記のルールを使用しようとsort_inc、最後
を除去します。
sort_inc([H|[]],[H]).
sort_inc(UnOrderedList,[H|OrderedTail]) :-
min(UnOrderedList,H),
remove(H,UnOrderedList,T),
sort_inc(T,OrderedTail).
ソートは素晴らしい作品が、私は、リスト上でルールを実行した後swiplでセミコロンを押したときにように、それはリストの最後の値を繰り返すことになります:
sort_inc([3,6,8,4],List).
List = [3, 4, 6, 8] ;
List = [3, 4, 6, 8, 8] ;
List = [3, 4, 6, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8, 8|...] .
なぜそれがありませんセミコロンが入力されたときにfalseを返す代わりに、この最後の値を繰り返します。
remove/3の最初の節では、remove(_、[]、[])を参照していますか?空のリストから何かを削除しようとすると空のリストだけが返されると思いました。要素が属していない場合、これは良い最後の再帰的なステップと考えました。 –
また、あなたが書いた削除ルールでは、remove(1、[2]、List)はList = []を返します。私は、単一の要素リストが適切な呼び出しなしでアイテムを失うことを望んでいません。 –
あなたが正しいと思われます、私の最初の実装であるremove/3は壊れました、残念です。これは現在修正済みです(うまくいけば)、私は答えを更新しました。また、私が言及したdelete/3は、remove/3が要素のすべての出現を即座に削除する点でremove/3とは異なりますが、remove/3はバックトラック中に要素を1つずつ削除します。 –