Prolog编程
我使用爬山和光束搜索算法在Prolog中为nqueens拼图制作了两个程序。
不幸的是,我没有经验来检查程序是否正确并且我处于死胡同。
如果有人可以帮助我,我将不胜感激。
不幸的是,登山计划不正确。
:(
光束搜索中的程序是:
queens(N, Qs) :-
range(1, N, Ns),
queens(Ns, [], Qs).
range(N, N, [N]) :- !.
range(M, N, [M|Ns]) :-
M < N,
M1 is M+1,
range(M1, N, Ns).
queens([], Qs, Qs).
queens(UnplacedQs, SafeQs, Qs) :-
select(UnplacedQs, UnplacedQs1,Q),
not_attack(SafeQs, Q),
queens(UnplacedQs1, [Q|SafeQs], Qs).
not_attack(Xs, X) :-
not_attack(Xs, X, 1).
not_attack([], _, _) :- !.
not_attack([Y|Ys], X, N) :-
X == Y+N,
X == Y-N,
N1 is N+1,
not_attack(Ys, X, N1).
select([X|Xs], Xs, X).
select([Y|Ys], [Y|Zs], X) :- select(Ys, Zs, X).
没有找到相关结果
已邀请:
3 个回复
搜洼挂时
是女王的数量或者棋盘的大小(),其中,是女王在线上的位置。 让我们详细介绍上面算法的每个部分,以了解会发生什么。
它向SWI-Prolog指示加载包含约束满足问题的谓词的模块。
谓词是算法的入口点,并检查术语是否格式正确(数字范围,列表长度)。它会检查女王是否在不同的线路上。
它检查当前女王的后代对角线上是否有一个女王被重复。
与之前相同,但它会检查上升对角线上是否有女王。 最后,通过调用谓词
可以找到结果,例如:
舜辉
如果没有
攻击
,则
为真。
是一个简单的
检查(参见SWI-Prolog手册)和你的
谓词的结合,乍一看似乎是正确的。
熊融炭臀陛
然而,最终的链接以三种不同的方式解决了这个问题,因此您可以与三种已知的解决方案进行比较。