2011-11-08 3 views
1

私はProlog(下のコード)にバブルソートを書きました。それは動作しますが、においがします。私はプロローグにはかなり新しいです。それらを使用するために、別のものに私が何かに真の値を変換するには、この機能を使用する必要が本当に真実をPrologの値に変換する必要がありますか?

% Problem: convert the true value to something 
% I can actually use. 
sorted_value(X,X) :- sorted(X). 
sorted_value(X,[]) :- not(sorted(X)). 

それは(この場合は[]、)奇妙だとFalse:ここに問題の部分です。そこに清潔な方法はありませんか?

% Bubble Sort a list. 

% is the list sorted? 
sorted([]). 
sorted([Head|[]]). 
sorted([First|[Second|Rest]]) :- 
    min(First,Second,First), 
    sorted([Second|Rest]). 

% swap all pairs in the list that 
% needs to be swapped 
bubble_sort_list([], []). 
bubble_sort_list([Head|[]],[Head]). 
bubble_sort_list([First|[Second|Rest]], [One|Solution]) :- 
    min(First,Second, One), 
    max(First,Second,Two), 
    bubble_sort_list([Two|Rest],Solution). 

% Problem: convert the true value to something 
% I can actually use. 
sorted_value(X,X) :- sorted(X). 
sorted_value(X,[]) :- not(sorted(X)). 

% Repeatedly call bubble_sort until 
% the list is sorted 
bubble_sort_helper([],List, Solution) :- 
    bubble_sort_list(List, SortedList), 
    sorted_value(SortedList, Value), 
    bubble_sort_helper(Value,SortedList, Solution). 
bubble_sort_helper(A,List,List). 

% this is what you call. 
buuble_sort(List,Solution) :- 
    bubble_sort_helper([],List,Solution). 

答えて

4

すべての述語コールが(おそらく複数回)成功するか失敗するかのいずれか。宣言的に考えてソートされたリストが本当に記述されているとすれば、プログラムで真理値そのものを明示的に表現する必要はほとんどありません。むしろ、ソートされたリストの大文字小文字を記述するために、Prologプログラムに "ascending(List)"のような述語呼び出しを置くことは、通常は十分です。代わりに "ascending(List、T)"のような述語を呼び出してから、Tを使用してケースを区別する利点はないようです。述語そのものの暗黙の真理値を直接使用しないのはなぜですか?あなたが本当に真理値を具体化する必要がある場合は、たとえば/ 1回昇順呼び出しを避けるために、このようにそれを行うことができます:昇順/ 1の真実はケースを区別するために使用される方法

ascending(Ls, T) :- 
    ( ascending(Ls) -> T = true 
    ; T = false 
    ). 

お知らせ。