2017-05-30 16 views
1

おはよう。 私はあなたの助けが必要です。 は、私が試したのですリストから行列を作成

サイズNとのリストから(サイズSQRT(N)* SQRT(N)の行列)リストのリストを作りたいが、それは私のために動作しません:(

gen(L,T,Matrix) 
あなたは、たとえば

をしたい場合は、よりのparamを追加するのは自由です Tは行列のサイズである

gen([1,2,3,4,5,6,7,8,9],3,Matrix) 
Matrix = [[1,2,3],[4,5,6],[7,8,9]] 
+1

あなたのリストの長さが完璧な正方形ではない場合、どうなると思いますか?これは簡単です:リストは行列の行または列の主要表現です。どうしたの? – duffymo

+1

なぜ 'T'が必要ですか?なぜリストはリストの 'length/2'から派生していないのですか? –

+0

何を試してみましたか、具体的にどこに詰まっていますか?そして、あなたが望むマトリックスはあなたが与えられたリストにどのように関係していますか? – lurker

答えて

2

これは実際にはかなり簡単です問題。

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

あなたがリストあなたのサイズを制御するためにlength/2を使用することができますトリックはappend/3は、多くのインスタンス化パターンを持ち、かつ離れそれらを破るだけでなく、接着剤のリストにまとめても使用することができますことを覚えておくことです同様に作成してください:

?- append(X, Y, [1,2,3,4]), length(X, 3). 
X = [1, 2, 3], 
Y = [4] ; 
false. 

これはあなたが必要とするほとんどすべてです。残りは、再帰呼び出しでこれを折り返しているだけです。

gen([], _, []). 

これは基本的には、私がフラット表現や行列表現から外れていれば、私の次元は関係ありません。今

再帰的な場合:

gen(List, T, [Start|Rest]) :- 
    append(Start, Remainder, List), 
    length(Start, T), 
    gen(Remainder, T, Rest). 

これは非常に基本的な再帰的な述語です。 append/3に続いてlength/2のステップは上記と同じである。結果の次のチャンクとしてListの接頭語の長さをTに設定します。それから、残ったリストに自分自身を再帰的に適用して残りの結果を生成します。クール側の利点として

、この述語は、両方の方法を動作します:

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

それがどのようにいいです!

+0

とどのように賢いです!私は非常に感謝している@ダニエル –

関連する問題