2016-05-16 9 views
1

Ich möchte diese Art von Liste zu reisen: [worker1(J, 10), worker2(T, 20), worker3(P, 30)]. , zuerst mit dem Kopf beginnend, kombiniert es mit dem nächsten Element, und bis zum Ende gehen, und wenn an diesem Punkt ich keine Lösung erreichen (mein Problem wird von der Reihenfolge der Arbeiter beeinflusst), dann möchte ich mit anderen Arbeitern beginnen und alle anderen Möglichkeiten erkunden.Wie Elemente einer Liste auf verschiedene Arten zu kombinieren

Ich bin mir nicht sicher, ob es eine einfache Möglichkeit gibt, dies zu tun, aber gerade jetzt ist die einzige Idee, die ich versuchen muss, um eine Übung zu lösen, also wollte ich hier fragen. Das Problem mit dem, was ich weiß, so weit, dass ich es so reisen würde:

w1-w2 w1-w3, w1-w4

wenn dies fehlschlägt, durch Rekursion, würde ich den Kopf überspringt und würde haben:

w2-w3, w2-w4

aber nicht w2-w1, so würde ich mögliche Lösungen fehlen. Ich habe nichts gefunden, wenn ich umher schaue, also nehme ich an, dass ich keine korrekte Terminologie verwende.

Antwort

2

Wenn Sie Google "Prolog-Kombinationen einer Liste" finden, finden Sie Prolog Guide - Combinatorics. Hier ist eine leichte Variation eines Prädikats dort gezeigt, dass Teil-Listen von N Elemente einer bestimmten Liste generieren L:

comb(0, _, []). 
comb(N, [X|T], [X|Comb]) :- 
    N #> 0, 
    N1 #= N - 1, 
    comb(N1, T, Comb). 
comb(N, [_|T], [X|Comb]) :- 
    N #> 0, 
    comb(N, T, [X|Comb]). 

Um alle Paare zu erhalten Sie nach, können Sie dies mit nennen:

comb(2, List, Comb). 

Zum Beispiel:

| ?- comb(2, [a,b,c,d], R). 

R = [a,b] ? a 

R = [a,c] 

R = [a,d] 

R = [b,c] 

R = [b,d] 

R = [c,d] 

no 

Wenn Sie dash Paare möchten, können Sie ordnen Sie einfach mit:

pair_list_dash([X,Y], X-Y). 
Verwandte Themen