2

Bprolog でのみ解決策が見つかりました。SWI PROLOG で JPL によって翻訳する方法を教えてください。または、jpl libriry を使用して解決策を講じることができます

    // by Nobukuni Kino
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import bprolog.plc.Plc;   
public 
class Queens extends Applet implements Runnable {
  static int nqueens = 8;
  /* Run as an application */
    public static void main(String args[]) {
        Frame f = new Frame("Queens");

  f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
      System.exit(0);
    }});

  Queens qb = new Queens();
        qb.init();
        f.add("Center",qb);
        f.setSize(321,321);
        f.show();
  qb.run1();
  System.exit(0);
    }

  int w,h;
  Color pieceColor = new Color(255,150,150);
  Thread runner;

  public void start() {
      if (runner == null) {
          runner = new Thread(this);
          System.out.println("Start");
          runner.start();
      } else {
          runner.resume();
      }
  }

  public void stop() {
      if (runner != null) {
          runner.suspend();
      }
  }

  public void run(){}

  public void run1() {
      Plc.startPlc(new String []{});
      Integer[] queens = new Integer[nqueens];
      for (int i=0; i<nqueens; i++) queens[i] = new Integer(i+1);
      Plc goal = new Plc("callQueens", new Object[] {queens,this});
                Plc.exec("load('queens')");
      goal.call();
  }

  public void paint(Graphics g) {
      board(g);
  }
  public void update(Graphics g) {
  }

  public void board(Graphics g) {
      w = (getSize().width-1)/nqueens;
      h = (getSize().height-1)/nqueens;
      g.setColor(Color.black);
      g.drawRect(0, 0, nqueens*w+1, nqueens*h+1);

      for (int i = 1; i <= nqueens; i++) {
          for (int j = 1; j <= nqueens; j++) {
              clearSquare(i,j);
          }
      }
  }
  public void putSquare(Integer row, Integer col) {
      putSquare(row.intValue(), col.intValue());
  }
  public void putSquare(int row, int col) {
      Graphics g = getGraphics();
      g.setColor(pieceColor);
      g.fillRect(w*(row-1)+1, h*(col-1)+1, w, h);
      Thread.yield();
  }

  public void clearSquare(Integer row, Integer col) {
      clearSquare(row.intValue(), col.intValue());
  }
  public void clearSquare(int row, int col) {
      Graphics g = getGraphics();
      if ((row+col)%2 == 1) {
          g.setColor(Color.black);
      }
      else {
          g.setColor(Color.white);
      }
      g.fillRect(w*(row-1)+1, h*(col-1)+1, w, h);
      Thread.yield();
  }
  public void sleep(Integer mill) {
      try {
          Thread.sleep(mill.intValue(),0);
      } catch(InterruptedException e) {}
  }
}
:-module queens.
:-public queens/2.
draw(M,N):-
        global_get(board,Qb),
    javaMethod(Qb,putSquare(M,N)).
draw(M,N):-
        global_get(board,Qb),
    javaMethod(Qb,clearSquare(M,N)),
    fail.

callQueens(Q,Qb):-
    cputime(Start),
    queens(Q,Qb),
    cputime(End),
    T is End-Start,
        write(executionTime(T)),nl,
        statistics.

queens(Q,Qb):-
    javaMethod(Qb,sleep(500)),
        global_set(board,Qb),
        put(Q,[],R),write(R),nl,
    javaMethod(Qb,sleep(1000)),
    fail.
queens(Q,Qb):-
    global_set(board,[]). % Qb is not valid after return to Java

put([Q1|Qs],Board,Result):-!,
    sel([Q1|Qs],Q,Rs),
    safe(Board,Q,Q),
    length(Qs,L),N is 1+L,
    draw(Q,N),
    put(Rs,[Q|Board],Result).
put([],Result,Result).

safe([Q|Rs],P,M):-!,
   PP is P+1,
   Q\==PP,
   MM is M-1,
    Q\==MM,
   safe(Rs,PP,MM).
safe([],P,M).

sel([X|Y],X,Y).
sel([X|Y],Z,[X|W]):-sel(Y,Z,W).
4

1 に答える 1

2

文字通りの翻訳は、おそらく努力する価値がありません。あなたが示すコードは、変更が非常に難しい非常に具体的な検索戦略をエンコードしています。実際のロジックと副作用は完全に織り交ぜられています。

ただし、はるかに興味深い SWIのアニメーションがあります。library(clpfd)そこでは、ラベリング戦略を直接交換することが可能です。これで、単純な単純なラベル付けが効果的でないことがわかった理由がわかります。同様に、ビューアのコードを変更することなく、独自の戦略を追加できます。

于 2014-06-02T21:01:36.607 に答える