例題(N-Queen)
この例は、N-Queen の GUI を Tcl/Tk で実装したものです。
N-Queen を解くプログラムは、KLIC側で記述されています。
盤のサイズと解の選択が GUI から行えるようになっています。
プログラム
プログラムは、sample/queen ディレクトリの下にあります。
このプログラムは、2つのファイルから構成されます。
- queen.kl1 : メインプログラム(KLIC側)
- queen.tcl : GUI部を提供するサブプログラム(Tcl/Tk側)
コンパイル
このプログラムは、sample/queen のディレクトリにあります。
このプログラムを利用する前に、トップディレクトリで make を行い、 klitcld をコンパイルしておいてください。
このプログラムをコンパイルするには、このディレクトリで make すればOKです。
コンパイルが終了すると、queen という名前の実行ファイルが出来ていると思います。
実行
まず、klitcld を実行します。これは、Tcl/Tk を実行するためのプログラムです。
% ./kltcld &
のようにして、バッググラウンドで実行させるとよいでしょう。
このあと、
% ./queen
とすると、プログラムが動作します。
Tcl/Tk の GUI は、
のようになります。
「Size :」と書かれたところに書かれている数字を変更し、リターンキーを押すか、隣の「Solve」ボタンを押すとKLIC側のプログラムで解を求めます。
入力できる数字は、4から8までとなっています。
右側のスライダーで表示する解を選ぶことが出来ます。
プログラムを終了するには、「Exit」と書かれたボタンを押します。
プログラムの説明
KLIC 側の主な述語は以下のとおりです。
- main
- まず、klitcl と Tcl/Tk を初期化します。
その後に、queen.tcl を読み込んで、GUI の設定を行います。
次に、queen.tcl に記述された"get_size"コマンドを用いて、設定されている盤の大きさを取得します。
そして、solveQueenSub/3 を用いて、その数字に対応した N-Queen を解き、GUI に設定します。
この後、klitcl:tk_mainloop/2 で Tcl/Tk のイベントを待ちます。
- solveQueen +N-list +InputStream -OutputStream
- Tcl/Tk 側から利用される述語です。
solveQueenSub/2 を呼び出し、N-Queen を解きます。
その後に、次の呼び出しを待つため、klitcl:tk_wait/2 を呼び出します。
- solveQueenSub +N-str +InputStream -OutputStream
- N-strに文字列で指定された大きさの N-Queen を解きます
queen/2 を用いて、解を取得し、hanoi.tcl の "set_answers" コマンドを利用し解を GUI 部に設定します。
- quit +Arg +InputStream -OutputStream
- Tcl/Tk 側から利用され、終了処理をします。
- queen +N -Ans
- Nに指定された大きさの N-Queen を解き、その解をリストにして Ansに設定します。
Tcl/Tk 側の主なコマンドは以下のとおりです。
- get_size
- GUI 部で持っている盤のサイズを返します。
- calc
- 「Solve」ボタンが押されたときに実行されるコマンドです。
"Size :"に書かれた数字が正しいものであった場合、そのサイズを用いて、solveQueen/3 の述語を呼び出します。
- set_answers ans
- N-Queen の解を設定します。
ansに解の情報をリスト形式で設定します。
例えば、"set_answers {{3 1 4 2} {2 4 1 3}}"のように利用します。
- quit_operation
- 終了処理をします。
KLIC 側の main:quit/3 を呼び出します。