2016-11-24 1 views
0

Ich möchte eine Liste von einem Graphen erhalten. Die Variablen mit zwei Buchstaben sind die Punkte und der eine Buchstabe ist eine Linie. Jede Zeile kann mehrere Punkte enthalten.Prolog Get Liste aus verschiedenen Beziehungen

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). 

Jetzt möchte ich eine Liste mit allen Punkten einer Zeile erhalten. Durch die Eingabe von:

getpoints(c, X). 

würde ich

X = [bs, oc, tc] 

Dies ist zu erwarten, wie ich versuchte, meine Ergebnisse zu erhalten:

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

Hat jemand eine Idee?

+0

Ich weiß, dass ich die fehlenden Punkte in den ersten Relationen habe, aber ich kann den Beitrag nicht mehr bearbeiten. Aber ich habe es mit der richtigen Syntax versucht :-) –

+1

Punkte, für 'conn', hinzugefügt. – max66

Antwort

0

Wenn Sie nicht daran interessiert, in einer bestimmten Reihenfolge der Punkte sind, könnten Sie setof/3

von Beispiel

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

--- EDIT ---

Ist Es ist sehr kompliziert, die Reihenfolge der Punkte zu bekommen?

Wenn Sie Punkt sind wirklich eine Linie (keine allgemeine Grafik) sind, können Sie so etwas wie

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). 

Die Idee finden, in getpoints/2, der Start Punkt der Linie schreiben können, das ist der Punkt, der links von conn/3 (conn(Start, NextPoint, Line)) liegt, aber nicht rechts von conn/3 (\+ conn(_, Start, Line)) steht.

Auf diese Weise haben Sie die ersten beiden Punkte der Zeile und beim rekursiven Aufruf von nextLine/3 erkennen Sie die folgenden Punkte in der richtigen Reihenfolge.

+0

Ist es sehr kompliziert, die Reihenfolge der Punkte zu bekommen? Das wäre fantastisch! Aber danke für deine Antwort :-) –

+0

@ bf2012 - die Reihenfolge des Punktes? ... Lass mich nachdenken ... nein, ich vermute nicht (nicht kompliziert) wenn 'Line' wirklich eine Linie darstellt ... lass mich spielen eine Weile. – max66

+0

@ bf2012 - erweiterte meine Antwort um die geordneten Punkte zu erkennen. – max66