gpt4 book ai didi

prolog - 在 Prolog 中使用空间状态 "graph"的 8 皇后解决方案不起作用

转载 作者:行者123 更新时间:2023-12-04 04:58:37 25 4
gpt4 key购买 nike

我正在 Ivan Bratko 的书上学习 Prolog:人工智能编程,在这本书中我发现了这个版本的 8 Queens 问题,它使用了 空间状态“图”解决问题:

s(Queens, [Queen|Queens]) :- member(Queen, [1,2,3,4,5,6,7,8]),
noattack(Queen, Queens).

goal([_,_,_,_,_,_,_,_]).

noattack(_,[],_).

noattack(Y,[Y1|Ylist],Xdist) :-
Y1-Y =\= Xdist,
Y-Y1 =\= Xdist,
Dist1 is Xdist + 1,
noattack(Y,Ylist,Dist1).

solve(N,[N]) :- goal(N).

solve(N, [N|Sol1]) :- s(N,N1),
solve(N1,Sol1).

它结合了基于置换的 8 Queens 问题解决方案(使用其 noattack/3 关系)和 s/2 谓我认为建立可能的后继状态状态(我的图的节点)。所以我有类似的东西:

s(ActualState, SuccessorState)

目标/1 谓词我认为只指定我必须放置 8 个皇后。

在书上说我执行这个查询: 解决([],解决方案)它将生成一个带有增加皇后数量的棋盘位置列表,并且该列表将以八个皇后的安全配置结束。

但是,如果我尝试执行此查询不起作用,我将获得以下输出:
?- solve([],Solution).
ERROR: s/2: Undefined procedure: noattack/2
ERROR: However, there are definitions for:
ERROR: noattack/3

因为,没错, 无攻击第 2 行中调用的谓词仅采用 2 个参数,但 无攻击谓词必须有 3 个参数......书上的 bue 以这种错误的方式给出,我不知道如何解决这个问题......

为什么?我错过了什么?

最佳答案

几个错误:

s(Queens, [Queen|Queens]) :- member(Queen, [1,2,3,4,5,6,7,8]),
noattack(Queen, Queens, 1).

noattack(_,[],_) :- !.
noattack(Y,[Y1|Ylist],Xdist) :- Y =\= Y1,
Y1-Y =\= Xdist,
Y-Y1 =\= Xdist,
Dist1 is Xdist + 1,
noattack(Y,Ylist,Dist1).

然后,
18 ?- solve([],_X), last(_X,S).
S = [4, 2, 7, 3, 6, 8, 5, 1] ;
S = [5, 2, 4, 7, 3, 8, 6, 1] ;
S = [3, 5, 2, 8, 6, 4, 7, 1] ;
S = [3, 6, 4, 2, 8, 5, 7, 1] ;
S = [5, 7, 1, 3, 8, 6, 4, 2] ;
S = [4, 6, 8, 3, 1, 7, 5, 2]

并且,
25 ?- findall( X, solve([],X), _S), length(_S,N).
N = 92.

关于prolog - 在 Prolog 中使用空间状态 "graph"的 8 皇后解决方案不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com