2

私の問題は次のとおりです。Prolog を学習しているときに、NxN Sudoku ソルバーを作成したいと考えていました。このソルバーは次のような入力を取得します

    [[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]]

それらのいくつかは変数である可能性があります。ソルバーはその数独を解かなければなりません。問題はかなり小さいです:

    firstElementsOf([],_).
    firstElementsOf([[X|_]|Rest2],Y) :-
      firstElementsOf(Rest2,Y2),
      append([X],[Y2],NotFlat),
      flatten(NotFlat,Y).

すべての列に個別の番号があるかどうか、これがチェックの始まりです。YfromfirstElementsOfには、指定された行の最初の要素のみが含まれている必要があります。例では:

    [1,3,2,4]

悲しいことに、append のおかげで、常に別の空のスペースがYリストに追加されます。それは与えます:

    [1,3,2,4,_1320]

Question1: それを取り除く方法はあり_1320ますか?

質問 2: これも正しいですか? それを使用して入力の 2 番目と 3 番目の要素を取得する方法はありますか?

4

1 に答える 1

0

質問 1 の場合: エラーは

firstElementsOf([],_).

あるべきだと思います

firstElementsOf([],[]).

トピック外: 他の節を次のように単純に記述できないと確信していますか?

firstElementsOf([[X|_]|Rest2],[X|Y]) :-
  firstElementsOf(Rest2,Y).

質問 2 について: より一般的な述語を提案しますgetPosList/3getPosElem/3

getPosElem([H | _], 1, H).

getPosElem([_ | T], Pos, H) :-
  Pos > 1,
  Pm1 is Pos - 1,
  getPosElem(T, Pm1, H).

getPosList([], _, []).

getPosList([H | T], Pos, [E | L]) :-
  getPosElem(H, Pos, E),
  getPosList(T, Pos, L).

position にあるすべての要素のリストを抽出するPosので、

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 1, L),

firstElementOf([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], L)および抽出と[1, 3, 2, 4]同等です。

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 2, L),

抽出[2, 4, 3, 1],

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 3, L),

抽出[3, 1, 4, 2],

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 4, L),

抽出[4, 2, 1, 3]して

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 5, L),

または 5 より大きい数値の場合、false を返します

于 2016-12-26T18:35:52.083 に答える