2016-11-24 5 views
0

グラフからリストを取得したいと思います。 2文字の変数は点で、1文字は線です。各行には複数のポイントを含めることができます。Prologは異なる関係からリストを取得します

conn(bs, oc, c). 
conn(oc, tc, c). 
conn(bs, gp, j). 
conn(gp, cc, j). 
conn(gp, pc, p). 
conn(pc, ls, p). 
conn(gp, oc, v). 
conn(oc, pc, b). 
conn(pc, cc, b). 
conn(tc, ls, n). 
conn(ls, cc, n). 

link(X, Y, Z) :- conn(X, Y, Z), !. 
link(X, Y, Z) :- conn(Y, X, Z). 

ここで、ラインに属するすべてのポイントを含むリストを取得したいとします。入力して:

​​

は、私は、これは私が私の結果を取得しようとしました方法です

X = [bs, oc, tc] 

期待:

getpoints(Line, [First|[]]) :- not(link(First, _Second, Line)). 
getpoints(Line, [First|Rest]) :- link(First, _Second, Line), getpoints(Line, Rest). 

誰もがアイデアを持っていますか?

+0

私は最初のリレーションズに欠けているポイントがありますが、私はもう投稿を編集できません。しかし、私は正しい構文でそれを試しました:-) –

+1

ポイントは、 'conn'のために追加されました。 – max66

答えて

0

あなたがポイントの特定の順序に興味を持っていない場合、あなたは

getpoints(Line, Points) :- 
    setof(X, Y^(conn(X, Y, Line) ; conn(Y, X, Line)), Points). 

例ではsetof/3

を使用することができますが--- EDIT ---

はですそれは非常にポイントの順序を得るcomplicadet?

あなたがポイントしている場合は、実際に行(いない、より一般的なグラフ)している、あなたは

nextLine(Line, EndLine, []) :- 
    \+ conn(EndLine, _, Line). 

nextLine(Line, Start, [NextPoint | NextLine]) :- 
    conn(Start, NextPoint, Line), 
    nextLine(Line, NextPoint, NextLine). 

getpoints(Line, [Start, NextPoint | NextLine]) :- 
    conn(Start, NextPoint, Line),  
    \+ conn(_, Start, Line), 
    nextLine(Line, NextPoint, NextLine). 

ような何かを書くことができますアイデアは、getpoints/2で、ラインのStartポイントを見つけることですそれはconn/3conn(Start, NextPoint, Line))の左側にあるが、conn/3\+ conn(_, Start, Line))の右側にはない点である。

このようにして、最初の2点があり、nextLine/3を再帰的に呼び出すと、次の点が正しい順序で検出されます。

+0

ポイントの注文を得ることは非常に複雑ですか?それは素晴らしいだろう!しかし、あなたのアンサイザーに感謝します:-) –

+0

@ bf2012 - ポイントの順番... ...私は考えてみましょう...いいえ、私は(ラインではなく)実際に行を表す場合はないしばらく。 – max66

+0

@ bf2012 - 注文点を検出するための私の答えを広げました。 – max66

関連する問題