2016-07-01 5 views
1

私はメッセージを送信するためのネットワーク料金の降順であるかどうかを表示するようにPrologルールを作成して送信者のリストを与える必要があります。一致している場合はtrueを返し、そうでない場合はfalseを返します。質問の送信者の名前を書くことによってコストの降順を取得します。

私は数字を降順に表示するルールを作成しましたが、数字はメッセージのコストと仮定しますが、コストの降順に応じて送信者のリストをどのように置くことができますか。

8,4,3,2はコストであり、以下のルールでは、私がこのようなクエリを書く場合に正しい降順を示しています。:-?message([8,4,3,2])

message(8). 
message(4). 
message(3). 
message(2). 

私は、このデータ用に作成されたルールは、このような

message([_]):-!. 
message([_]):-!. 
message([A,B|T]) :-A >= B,!,message([B|T]). 

私の元のデータベースの外観です。今度は私のクエリは次のようになります:-?message([sonny,robert,fred,nayna]).

これは、コストが降順であるため真となります。私が間違っているのところ、私は、クエリ内の送信者の名前を書くことで、コストの降順を取得したいので、

%message(Sender, Receiver, Date, Cost_of_sending_a_message) 
message(sonny,robert,'2012-05-12',8). 
message(robert,sarah,'2012-05-12',5). 
message(julie,mary,'2012-05-12',6). 
message(fred,nayna,'2012-05-13',6). 
message(fred,daniel,'2012-05-14',6). 
message(nayna,lucia,'2012-05-15',3). 

あなたは私を教えていただけますか? SWI-Prologのライブラリーから

+0

@CommuSoft私にヒントを教えてください。私はあなたがプロローグに関して非常に多くの質問に答えたのを見ました。 –

答えて

2

ORDER_BY/2(solution_sequences)があなたを助けることができます。

使用例:

?- order_by([desc(C)], message(F,S,D,C)). 
C = 8, 
F = sonny, 
S = robert, 
D = '2012-05-12' ; 
C = 6, 
F = julie, 
S = mary, 
D = '2012-05-12' 
... 

が編集:また

?- findall(C, (order_by([desc(C)], message(F,S,D,C))), L). 

ライブラリ(集約)、または古典的なsetof/3は可能な解決法を提供しますが、手書きで書くことはPrologを学ぶ良い方法です。それはあなたが何をしているかによって決まります...

+0

これには ';'が必要です。各値を取得するために入力します。一度にすべての値を取得するにはどうすればよいですか?これを「findall」と組み合わせることはできますか? – rnso

+0

(SWI)Prologへようこそ。滞在を楽しんでください。私の編集を参照してください... – CapelliC

+0

それはL = [8,6,6,6,5,3]のみを生成します。どのようにしてすべてのレコード(F、S、D、C)をCの順序でリストすることができますか? – rnso

関連する問題