husseinjahan
۵ اسفند ۱۳۸۸, ۲۰:۵۶
منبع: The Art Of Prolog
نویسنده:sterling و shapiro
/* queens(N,Queens) :- Queens is a placement that solves the N queens problem, Represented as a permutation of the list of numbers [1,2,…,N]. */ queens(N,Qs) :- range(1,N,Ns), permutation(Ns,Qs), safe(Qs). /* safe(Qs) :- the placement Qs is safe. */ safe([Q|Qs]) :- safe(Qs), not attack(Q,Qs). safe([]). attack(X,Xs) :- attack (X,1,Xs). attack(X,N,[Y|Ys]) :- X is Y+N ; X is Y-N. attack (X<N,[Y|Ys]) :- N1 is N+1, attack(X,N1,Ys). permutation(Xs,[Z|Zs]) :- select(Z,Xs,Ys), permutation(Ys,Zs). permutation([],[]). select(X,[X|Xs],Xs). select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs). range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,N,Ns). range(N,N,[N]).
روش دوم:
queens(N,Qs) :- range(1,N,Ns), queens(Ns,[],Qs). quees(UnplacedQs,SafeQs,Qs) :- select(Q,UnplacedQs,UnplacedQs1), not attack(Q,SafeQs), queens(UnplacedQs1,[Q|SafeQs],Qs. queens([],Qs,Qs). range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,N,Ns). range(N,N,[N]). select(X,[X|Xs],Xs). select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs). attack(X,Xs) :- attack (X,1,Xs). attack(X,N,[Y|Ys]) :- X is Y+N ; X is Y-N. attack (X<N,[Y|Ys]) :- N1 is N+1, attack(X,N1,Ys).
نویسنده:sterling و shapiro
/* queens(N,Queens) :- Queens is a placement that solves the N queens problem, Represented as a permutation of the list of numbers [1,2,…,N]. */ queens(N,Qs) :- range(1,N,Ns), permutation(Ns,Qs), safe(Qs). /* safe(Qs) :- the placement Qs is safe. */ safe([Q|Qs]) :- safe(Qs), not attack(Q,Qs). safe([]). attack(X,Xs) :- attack (X,1,Xs). attack(X,N,[Y|Ys]) :- X is Y+N ; X is Y-N. attack (X<N,[Y|Ys]) :- N1 is N+1, attack(X,N1,Ys). permutation(Xs,[Z|Zs]) :- select(Z,Xs,Ys), permutation(Ys,Zs). permutation([],[]). select(X,[X|Xs],Xs). select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs). range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,N,Ns). range(N,N,[N]).
روش دوم:
queens(N,Qs) :- range(1,N,Ns), queens(Ns,[],Qs). quees(UnplacedQs,SafeQs,Qs) :- select(Q,UnplacedQs,UnplacedQs1), not attack(Q,SafeQs), queens(UnplacedQs1,[Q|SafeQs],Qs. queens([],Qs,Qs). range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,N,Ns). range(N,N,[N]). select(X,[X|Xs],Xs). select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs). attack(X,Xs) :- attack (X,1,Xs). attack(X,N,[Y|Ys]) :- X is Y+N ; X is Y-N. attack (X<N,[Y|Ys]) :- N1 is N+1, attack(X,N1,Ys).