2016-04-12 16 views
1

Nehmen wir an, Sie haben eine Liste in Prolog wie: [3,4,2,2,1,4]. Wie würde man eine Liste von Listen aller möglichen Muster erstellen, die am ersten Element der Liste beginnen, dann entweder zum i + 2ten Element oder zum i + 3ten Element gehen, und so weiter von dort.Prolog: Erzeugen aller Möglichkeiten einer Liste mit einem gegebenen Muster

Beispiel: Angenommen, ich habe [3,4,2,2,1,4,8]. Ich möchte in der Lage sein, eine Liste von Listen zu erzeugen wie: [[3,2,1,8], [3,2,4], [3,2,8]]

I.e. alle Möglichkeiten von jedem anderen Element oder jedem i + 3 Element, oder jede andere Kombination, wie i + 2, i + 3, i + 2, i + 2 usw.

Ich habe meine eigene Version implementiert von einem Powerset, aber ich kann nicht herausfinden, wo ich anfangen soll.

+0

Wenn Sie zu erfassen sind, zu erhalten versuchen, sagen wir, je 3. Element, könnte man so etwas wie, 'verwenden foo ([H1, H2, H3 | T], [H1 | R]): - foo (T, R). "Wenn Sie parametrieren möchten, wie viele Sie überspringen, können Sie einen Zähler verwenden. – lurker

+0

Wenn es eine Liste gibt, suche ich nach einer Möglichkeit, alle Möglichkeiten der folgenden zu generieren: Beginne beim ersten Element der Liste, dann geh entweder zum dritten Element oder zum vierten Element. Von dort gehen Sie entweder zum aktuellen + 2ten Element oder zum aktuellen + 3ten Element und so weiter. Entschuldigung für die Verwirrung. –

+0

Mein Kommentar war nicht als vollständige Antwort gedacht, sondern um ein paar Nudges zu geben, die helfen werden. Obwohl Sie Ihr Beispiel betrachten, scheinen Ihre Ergebnisse unterschiedliche Intervalle zwischen Elementen zu haben. '[3,2,4]' wählt 1., 3. und 6. (Intervalle von 2 und dann 3) oder 1., 4. und 6. (Intervalle von 3 und 2). Ich war mir also nicht ganz sicher, worauf Sie hinauswollen. – lurker

Antwort

1
gen([], []). 
gen([A], [A]). 
gen([A, _ | T], [A | Xs]) :- gen(T, Xs). 
gen([A, _, _ | T], [A | Xs]) :- gen(T, Xs). 

Ergebnisse in

?- gen([3,4,2,2,1,4,8], X). 
X = [3, 2, 1, 8] ; 
X = [3, 2, 1] ; 
X = [3, 2, 4] ; 
X = [3, 2, 4] ; 
X = [3, 2, 8] ; 
false. 

Sie findall/3 können alle Ergebnisse

?- findall(X, gen([3,4,2,2,1,4,8], X), Z). 
Z = [[3, 2, 1, 8], [3, 2, 1], [3, 2, 4], [3, 2, 4], [3, 2, 8]]. 
Verwandte Themen