1

Prolog で単純な Noughts-and-Crosses (Tic-tac-Toe) エバリュエーターを作成しようとしています。私が最初にやろうとしているのは、プログラムにすべての可能な勝利ボードを計算させることです。ロジックはまだ完全ではありません。実際にゲームをプレイして得られる有効なボードをチェックするわけではありません。単純に「3 のライン」を探しているだけです。

問題は、プログラム 'stops-short' です: 3 行を正しく検出し、3 行を構成する変数を統合しますが、他の変数の組み合わせは表示しません。(ウィニングライン上にないセル)。

これが私のプログラムと出力例です:

/*
Attempting to create a program that will output 'x' ,'o' or 'none'
given a (filled-in) tic-tac-toe board.
'x' - 'x' has won. (Literally there is a line of x's)
'o' - 'o' as above
'none' : no winners on the given board.

This does NOT check whether the board is in a valid state for tic-tac-toe!
*/

/* Define board states as facts */
cell(none).
cell(x).
cell(o).

/* Define winning line of 3 */
win_line(C1, C2, C3, Winner) :-
        cell(C1),
        cell(C2),
        cell(C3),
        C1 \== none,
        C1==C2,
        C2==C3,
        Winner=C1.

/* define the board rule: variables are 'encoded' for each cell by a coordinate (col,row) */
board(  C11, C12, C13,
        C21, C22, C23,
        C31, C32, C34, Winner) :-
        win_line(C11, C12, C13, Winner); /* Test the three rows */
        win_line(C21, C22, C23, Winner);
        win_line(C31, C32, C33, Winner);
        win_line(C11, C21, C31, Winner); /* Test the three columns */
        win_line(C12, C22, C32, Winner);
        win_line(C13, C23, C34, Winner);
        win_line(C13, C23, C34, Winner); /* Test the two diaganols */
        win_line(C11, C22, C34, Winner);
        win_line(C13, C22, C31, Winner).

私のクエリ、出力は次のとおりです。

| ?- board(C11,C12,C13, C21,C22,C23, C31,C32,C33, o).     

C11 = o
C12 = o
C13 = o ? a

C21 = o
C22 = o
C23 = o

C31 = o
C32 = o

C11 = o
C21 = o
C31 = o

C12 = o
C22 = o
C32 = o

C13 = o
C23 = o
C33 = o

C13 = o
C23 = o
C33 = o

C11 = o
C22 = o
C33 = o

C13 = o
C22 = o
C31 = o

(4 ms) yes

バージョン情報:

GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- 
4

2 に答える 2

1

最初の問題が解決したようです。

クエリに対して可能なすべての結果を取得する 1 つの方法は、次を使用することfindall/3です。

?- findall([A,B,C,D,E,F,G,H,I], board(A,B,C,D,E,F,G,H,I,o), Results).
Results = [[o,o,o,_,_,_,_,_,_],
           [_,_,_,o,o,o,_,_,_],
           [_,_,_,_,_,_,o,o,o],
           [o,_,_,o,_,_,o,_,_],
           [_,o,_,_,o,_,_,o,_],
           [_,_,o,_,_,o,_,_,o],
           [_,_,o,_,_,o,_,_,o],
           [o,_,_,_,o,_,_,_,o],
           [_,_,o,_,o,_,o,_,_]]

この場合、実際に重要な値のみが考慮され、他の値はそのままであることに注意してください。

他の値を実際のアトムにロックする必要がある場合は、それを行う方法がありますResults.

于 2013-06-01T19:04:30.987 に答える
0

わかりました。ボードのルールを次のように変更しました。

/* define the board rule: variables are 'encoded' for each cell by a coordinate (col,row) */
board(  C11, C12, C13,
        C21, C22, C23,
        C31, C32, C34, Winner) :-
        cell(C11), cell(C12), cell(C13),
        cell(C21), cell(C22), cell(C23),
        cell(C31), cell(C32), cell(C33),
        win_line(C11, C12, C13, Winner); /* Test the three rows */
[...]as before

したがって、すべての変数がセルの事実と統合されるという句をさらに追加します...なぜそれを行う必要があるのか​​ 100%確信が持てません...しかし、うまくいくようです...

于 2013-06-01T18:44:39.843 に答える