2017-05-16 11 views
1

私はプロローグを初めて使い、長さ2^1、2^2、2^3のリストに分割リストを書く必要があります。 .. 2^nなので、たとえば[1,2,3,4,5,6,7,8,9]があれば[[1]、[2,3]、[4,5、 6,7]、[8,9]]私はHaskellでそれを解決したが、このソリューションが続くと(心の中で効率的に書かれていないから学ぶことは簡単であるべきプロローグ長さ1,2,4,8のリストの分割リスト。プロローグを使用

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

私はプロローグを知りませんが、何か試しましたか? SOに協力している人々は、「これが問題です」または「これが私がやろうとしていることです」という詳細を提供していなければ、そうすることを躊躇しています。 – Adam

+0

@Adam、私はハスケルでこの作業を書いたが、プロローグでコードを変換する方法がわからない –

+3

Prologの教科書やチュートリアルを掘り下げ、基礎を習得してから何かを試してみる特定の質問。 – lurker

答えて

1

でそれを作る方法を見当もつかない):

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

さらに、ハスケルコードの次のバージョンがあります。

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

どちらも完璧ではありません。最初のクエリは最も一般的なクエリのために分岐し、2番目のクエリは他の方向に普遍的に終了しません。どのようにそれらを改善するためのヒントを感謝しています。

関連する問題