2017-01-06 14 views
1

を発行し、そのような私たち:プロローグ(Sicstus) - SETOFとfindAllの組み合わせは、ルートのセット与えられた駅がある考える

route(TubeLine, ListOfStations). 

route(green, [a,b,c,d,e,f]). 
route(blue, [g,b,c,h,i,j]). 
... 

Iは共通で、特定の駅を持っている行の名前を検索するために必要なのです。結果は、反復されないステーションで順序付けされなければならず、結果がなければ空のリストを返す必要があります。だから、

| ?- lines(i, Ls). 

を照会することは与えるべきである:

Ls = [blue,red,silver] ? ; 
no 

を私は次のことをやってみました:

lines(X, L) :- setof(L1, findall(W, (route(W, Stations),member(X, Stations)),L1), L). 

しかし、それは答えとして、以下を提供します:

Is = [[blue,silver,red]]; 
no 

したがって、二重ブレースで順序付けられていない。 findallだけを使ってみましたが、結果は順序付けされていません。私はソート関数を書いてそれを渡すことができたことを知っていますが、この例ではfindallとsetofだけを使用することが可能かどうか疑問に思っていましたか?

答えて

2

実際には、あなたの試みよりも簡単ですが、自由変数の挙動を把握し、不明なステーションが必要である(解決策がない場合はsetof/3が失敗する)事態を考慮する必要があります。

lines(X, Ls) :- 
    setof(L, Stations^(route(L, Stations), member(X, Stations)), Ls) 
    -> true ; Ls = []. 

簡単に代わる、あなたがやっているとまったく同じようにfindAll/3を使用して、言ったように(SETOFなし!)、および出力をソート。

+0

私は見る!あなたの答えをありがとう!あなたはそのような行動を実践することができるリソースを知っていますか? – qwerty

+0

[今すぐ学ぶ]の[第11章](http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch11)は読む価値があります。具体的には、[setof/3 section] (http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse49) – CapelliC

関連する問題