2017-05-16 5 views
1

Ich bin neu zu Prolog und müssen eine Beziehung schreiben, die Liste in Listen der Länge aufteilen 2^1, 2^2, 2^3. .. 2^n, also zum Beispiel, wenn wir [1,2,3,4,5,6,7,8,9] haben, sollten wir [[1], [2,3], [4,5, 6,7], [8,9]] ich löste es in Haskell, habe aber keine Ahnung, wie es in Prolog machen sollteSplit-Liste in Listen der Länge 1,2,4,8 .. mit Prolog

blocks :: Int -> [a] -> [[a]] 
    blocks _ [] = [] 
    blocks n ls = la : blocks (2*n) lb 
      where ~(la,lb) = splitAt n ls 
+3

Ich weiß nicht Prolog, aber hast du irgendwas probiert? Leute, die bei SO helfen, zögern, dies zu tun, wenn Sie nicht mehr Details liefern, dass nur "das ist das Problem" oder "das ist, was ich versuche" - sie wollen etwas Anstrengung sehen. – Adam

+0

@Adam, Ich schrieb diese Aufgabe in Haskell, aber ich habe keine Ahnung, wie man Code in Prolog konvertiert –

+3

Es ist Zeit, sich in ein Prolog-Lehrbuch oder -Tutorial zu vertiefen, ein paar Grundlagen zu vertiefen, dann kann man anfangen, etwas zu probieren und mehr zu fragen spezifische Frage. – lurker

Antwort

1

Diese Lösung leicht zu folgen und lernt von (nicht mit Effizienz im Vordergrund geschrieben):

split(L, X) :- split(L, 1, X). 

split([], _, []). 

split(X, N, [X]) :- 
    length(X, M), 
    M #< N, M #> 0. 

split(L, N, [X|Xs]) :- 
    N0 #= N * 2, 
    length(X, N), 
    append(X, R, L), 
    split(R, N0, Xs). 

Und hier ist eine Version nach Ihrem mehr Haskell Code eng:

split_at_squares(L, X) :- 
    split_at_squares_(L, 1, X). 

split_at_squares_([],_,[]). 
split_at_squares_([L|Ls], I, [X|Xs]) :- 
    split_at(I, [L|Ls], X, Xs0), 
    J #= I * 2, 
    split_at_squares_(Xs0, J, Xs). 

split_at(I, L, P, S) :- 
    length(L, LL), 
    J #= min(I, LL), 
    length(P, J), 
    append(P, S, L). 

Sie beide sind jedoch nicht perfekt. Der erste unterscheidet sich für die allgemeinste Abfrage und der zweite endet nicht universell in der anderen Richtung. Irgendwelche Tipps, wie man sie verbessert, werden geschätzt.