2011-01-13 1 views
0

SWI-Prologを操作する。私はランクのリストを持っていると言う:プロローグ内のファクトを比較するときに繰り返し回答を得る

rank(London, 3.5). 
rank(New York, 3.5). 
rank(Seattle, 2.3). 

そして私はプリントが/同じランクのいずれかの事実を返すルールを作るのまわりで私の頭を取得しようとしています。だからこの場合、それはロンドンの&ニューヨークで戻ってきます。

これまで私がこれまでに思いついたのは、唯一の問題は、私が(それは現在のルールでは完璧な意味を持っていますが)重複していることです。何らかの方法で再帰を使用するとこれが役に立ちますか?

equal_rank(_):- 
    rank(U1, R1), 
    rank(U2, R2), 
    U1 \== U2, 
    R1 == R2, 
    print(R1), print(': '), print(U1), print(', '), print(U2), nl, 
    fail. 

出力は次のようになります。私はただ、第2ラインを停止する方法を見つけ出すことはできません

3.5: London, New York 
3.5: New York, London 

+2

多くの不都合な "print/1"呼び出しに関する小さなコメント:代わりにformat/2を使用することを検討してください:format( "〜w:〜w、〜w \ n"、[R1、U1、U2]同じ結果となり、読み書きがはるかに容易になります。 – mat

答えて

1

単純なアプローチは、より少なくより試験とU1とU2との間の等しくないテストを交換することであろう。

U1 @< U2. 

所与のペアが一度だけ表示され、この方法。

+0

治療をしましたが、もう二重の結果はありません。ありがとう。 –

1

私はたぶんbagof/3を使用するものに行くだろうが、それはあなたが手近に抱えている問題に対して、それが好ましいかより適切なアプローチかどうかわからない。あなたが定義した事実と、次の目標は、あなたが望む結果を出すようだ:それはもちろん、書式設定上のいくつかの作業を必要とする

| ?- bagof(C, rank(C, X), Cs), length(Cs, L), L > 1. 

Cs = [london,'new york'] 
L = 2 
X = 3.5 

yes 

を。リストに結果を集めるという考え方は、あなたにとって有用かもしれません。ああ、ところで、私は変数である必要がある都市名については確信が持てませんでした。あなたが見ることができるように、私は素朴な原子を使ってrank/2の事実を主張しました。

bagof/3に関する追加情報については、online SWI-Prolog manual pageをご覧ください。

+0

私はこれがうまくいくと確信していますが、それは私が避けようとしている他の答えより複雑です。とにかくありがとう。 –

関連する問題