/*------------------------------------------------------------*/ /* 8王妃問題 */ /*------------------------------------------------------------*/ /* 開始するには eight.[enter]と入力します。 */ /* 解が見つかったら,結果を表示し"|:"のプロンプトが表示され */ /* 入力待ちになりますので,[enter]を入力して下さい。     */ /*------------------------------------------------------------*/ /*■メイン */ eight:- initialize, !, try(1). /*■初期設定 */ initialize:-clearFlag, init(-8), assert(numb(0)). init(17). init(I):-setFlag(I,I,I), II is I+1, init(II). /*■実行用述語クリア */ clearFlag:-retract(x(I,J)), fail. clearFlag:-retract(numb(X)),fail. clearFlag:-retract(a(X)), fail. clearFlag:-retract(b(X)), fail. clearFlag:-retract(c(X)), fail. clearFlag. /*■判定用フラグの設定・削除 */ setFlag(I,J,K):-assert(a(I)),assert(b(J)),assert(c(K)). delFlag(I,J,K):-(retract(a(I));true),(retract(b(J));true),(retract(c(K));true). /*■王妃を置けるかどうかをトライ */ try(9):-print. try(I):-check(I,1). check(I,9). check(I,J):-a(J), IpJ is I+J, b(IpJ), ImJ is I-J, c(ImJ),!, setX(I,J),delFlag(J, IpJ, ImJ), II is I+1, try(II), setFlag(J, IpJ, ImJ),JJ is J+1,check(I,JJ). check(I,J):-JJ is J+1,check(I,JJ). /*■王妃を置く位置を設定 */ del(I):-retract(x(I,Z)),fail. del(I). setX(I,J):-del(I),assert(x(I,J)). /*■結果表示 */ print:- retract(numb(N)),NN is N+1,assert(numb(NN)), write('【解】'),write(NN),nl,write('  '), print(1,1),get1(Z). print(9,J). print(I,9):-!, nl,write('  '), II is I+1,print(II,1). print(I,J):-x(I,J),!, write('●'),JJ is J+1,print(I,JJ). print(I,J):-write('□'),JJ is J+1,print(I,JJ).