2016-04-16 19 views
0

私は、次のルールがあります:あなたが見ることができるように、返しプロローグ:クエリのいくつかの結果間の最大値を見つける

compute_stats(A, B, C) 

、三つの値それぞれの反復:

  • Aは整数を;
  • Bはもう1つの整数です。
  • Cはリストです。

最高のA(整数)の結果を見つけるにはどうすればよいですか?

例:私は

compute_stats(A, B, C). 

を呼び出す場合

私は今、私は私だけ

A = 1200, 
B = 3, 
C = ['example3', 'example4']; 

を与えるもう一つのルールを必要とし、結果として

A = 1000, 
B = 10, 
C = ['example1', 'example2']; 

A = 1200, 
B = 3, 
C = ['example3', 'example4']; 

A = 800, 
B = 7, 
C = ['example5', 'example6']; 

のような何かを得ますそれは最大A.に

を持っている私は、異なる多くのことを試してみたが、彼らは動作しないようです:(

は助言にありがとうございます!

+0

最初の提案:それは関係であることを説明した名前にあなたの述語の名前を変更し、これを処理する1つの方法は、max_statsが最大の結果のリストを表しlist引数を持っている必要があります。 'get'はここには適合しません。誰が、あるいは、何が「得る」?コマンド/命令型プログラミング言語に適したコマンドです。 – false

+0

あなたは正しいです。私は新しく、まだこのような考え方に入る必要があります! – Nano

+0

それで良い名前をつけてください。 (最後の編集として) – false

答えて

0

これを行うにはいくつかの方法があります。 1つの方法は、setof/3がその結果をソートするという事実を利用することです。ここで

max_stats(MaxA, MaxB, MaxC) :- 
    setof(A-B-C, get_stats(A,B,C), R), % All results ordered by A (ascending) 
    reverse(R, [MaxA-MaxB-MaxC|_]).  % Maximum results 

setof/3は、昇順で、 get_stats(A,B,C)からのすべての結果である「タプル」 A-B-Cのリストを収集します。最大値が必要なので、結果の順番を逆にして( reverse/2)、そのリストの最初の要素を最大値として取ります。 A-B-Cの形式の条件の注文は、最初に Aのソート順に従って注文されるので、結果は最大 Aのものが得られます。
@falseのコメントごとに、複数の最大結果(最大値と同じ値)がある可能性があります。

max_stats(MaxResults) :- 
    setof(A-B-C, get_stats(A,B,C), R),  % All results ordered by A (ascending) 
    reverse(R, DescendingList), 
    all_max(DescendingList, MaxResults). % Maximum results 

% all_max/2 assumes the first argument is in descending order 
% and the second argument is the list of just the maximum values 
% of the first list 

all_max([X], [X]). 
all_max([X, Y|_], [X]) :- X @> Y. 
all_maxx([X, Y|T], [X|S]) :- 
    equal_elements(X, Y), 
    all_max([X|T], S). 

equal_elements(X-_-_, X-_-_). 
+0

ありがとう、それは完全に動作し、コードはクリーンでシンプルです! – Nano

+0

OPが最高のAを求められました。最高のA-B-Cのためではありません。 – false

+0

@false - OPは、最高のAを持つ 'A'、' B'、 'C'セットを求めました(* ...どうすれば最高のA *で結果を見つけることができますか?私の答えに(軽く)記述したように、 'set-f-'の 'A-B-C'はそれを達成していませんか? – lurker

関連する問題