このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/496
#  [1] 授業単元: 多次元配列  
#  [2] 問題文(含コード&リンク): 横8マス×縦8マスの盤面がある。プログラムを実行すると20個の石が盤面上にランダムに置かれる、そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定するプログラムを書きなさい。 
#                 わかりやすいインターフェースにすること、詳細は考えなさい。 
#                 盤面は二次元配列を使うこと。  
#  

'横8マス×縦8マスの盤面がある。プログラムを実行すると20個の石が盤面上にランダムに置かれる、そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定) :-
        '横8マス×縦8マスの盤面がある'(_盤面),
        プログラムを実行すると20個の石が盤面上にランダムに置かれる(_盤面),
        'そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定).

'横8マス×縦8マスの盤面がある'(_盤面) :-
        length(_盤面,8),
        findall(L,(
                   member(L,_盤面),
                   length(L,8)),
               _盤面).

プログラムを実行すると20個の石が盤面上にランダムに置かれる(_盤面) :-
        length(_石ならび,20),
        all(_石ならび,石),
        盤面上にランダムに置かれる(_石ならび,_盤面).

盤面上にランダムに置かれる([],_盤面).
盤面上にランダムに置かれる([_石|R],_盤面) :-
        盤面上にランダムに(_盤面),
        盤面上にランダムに置かれる(R,_盤面).
盤面上にランダムに置かれる(_石ならび,_盤面) :-
        盤面上にランダムに置かれる(_石ならび,_盤面).

盤面上にランダムに(_盤面) :-
        ランダムに(_行位置_0_起点,_列位置_0_起点),
        盤面上に(_行位置_0_起点,_列位置_0_起点,_盤面).

ランダムに(_行位置_0_起点,_列位置_0_起点) :-
        _行位置_0_起点 is random(8),
        _列位置_0_起点 is random(8).

盤面上に(_行位置_0_起点,_列位置_0_起点,_盤面) :-
        nth0(_行位置_0_起点,_盤面,_行),
        nth0(_列位置_0_起点,_行,_升目),
        var(_升目),
        _石 = _升目,!.

'そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定) :-
        キーボードから盤面上の位置を入力する(_行位置,_列位置),
        その場所に石があるかどうかを判定する(_盤面,_行位置,_列位置,_判定).

キーボードから盤面上の位置を入力する(_行位置,_列位置) :-
        整数を得る(行位置,(_行位置>=1,_行位置=<8),_行位置),
        整数を得る(列位置,(_列位置>=1,_列位置=<8),_列位置),!.

その場所に石があるかどうかを判定する(_盤面,_行位置,_列位置,_判定) :-
        nth1(_行位置,_盤面,_行),
        nth1(_列位置,_行,_升目),
        判定する(_升目,_判定).

判定する(_升目,石があります) :-
        var(_升目),!.
判定する(_升目,石はありません) :-
        \+(var(_升目)).