これは実際にはかなり簡単です問題。
?- 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.
それがどのようにいいです!
あなたのリストの長さが完璧な正方形ではない場合、どうなると思いますか?これは簡単です:リストは行列の行または列の主要表現です。どうしたの? – duffymo
なぜ 'T'が必要ですか?なぜリストはリストの 'length/2'から派生していないのですか? –
何を試してみましたか、具体的にどこに詰まっていますか?そして、あなたが望むマトリックスはあなたが与えられたリストにどのように関係していますか? – lurker