1

プロローグ プログラムでリストのリストを作成する際に問題が発生しています。行の単一のケースを返す述語があります。この行のすべてのケースをグループ化し、リストのリストに変換する必要があります。それらに問題なくアクセスできますが、終了すると最初の要素しか取得できません。

コードは次のとおりです。

sudoku3to2 :- s3to2(1).
s3to2(Line) :- 
   Line < 9, 
   Line1 is Line+1,
   s3getLine(Line,0,[L]),   
   assert(sudoku2(Y,L])),
   s3to2(Line1).
s3to2(9).

s3getLine(Line,X,  , ) :- 
   X < 9, 
   X1 is X + 1, 
   sudoku3(Line,X, ),
   s3getLine(Line,X1, , ).
s3getLine(Line,9,L,L).

sudoku3/3 は X,Y 座標の要素を返します。s3getLine(Line,9,L,L) に到達したら、戻り始めます。最初の要素だけでなく、集めたすべての要素を保持したいと考えています。そして、適切な述語呼び出しを構築するのに本当に苦労しています。

4

1 に答える 1

1

findall / 3は、より簡単に理解できる「リストコンストラクタ」です。

これは、見つかったすべてのソリューションを一覧表示し、指定されたパターンで要素を形成するビルトインです。ここで、パターンは実際には私たちが関心を持っている変数にすぎません。

私は/3の間を使用して、sudoku3ルールの順序に関係なく、正しく順序付けられた行列を取得します。

sudoku3(1, 1, a).
sudoku3(1, 2, b).

sudoku3(2, 1, c).
sudoku3(2, 2, d).

mat(M) :-
  W = 2,
  findall(Row,
    (between(1, W, R),
     findall(V, (between(1, W, C), sudoku3(R, C, V)), Row)
    ), M).

結果:

?- mat(M).
M = [[a, b], [c, d]].

W=9を変更する必要があります。

HTH

于 2012-10-22T20:40:46.320 に答える