我们假设我们有一个棋盘上的机器人,可以像国王一样移动。
董事会的电话是[1,1]至[8,8]。
起始位置为[1,1],最终为[8,8]。有一个列表X,其中包含障碍物的坐标列表,例如[[1,4],[2,5],[5,6]]。问题是:机器人是否有可能从起始位置移动到最终位置。
我做了这个谓词:
path([A,B],_):- A is 8, B is 8.
path([A,B],X):-
possibleMoves(A,B,L), % possibleMoves returns a list of all the possible coords that
the robot can go to. (Example for [1,1] are [[0,1],[0,0],[2,1]...])
member([Ex,Ey],L), % member generates all the possible members from the list L
not(member([Ex,Ey],X)), % if this member is not member of the "forbidden ones"
Ex<9,Ex>0,Ey<9,Ey>0, % and its coords are on the board
path([Ex,Ey],X).
isTherePath(X):- possibleMoves(1,1,L),
member(E,L),
path(E,X).
但是有一个错误,并没有返回任何价值。递归从未停止我无法找到原因。
答案 0 :(得分:2)
在一个谓词中定义一个有效的步骤 - 包括您拥有的所有限制。坚持这个命名惯例:X0
“第一”值,X
“最后”值
step(Forbidden,[X0,Y0],[X,Y]) :-
possibleMoves(X0,Y0,L), % rather: possibleMove([X0,Y0],L),
member([X,Y],L),
between(1,8,X),
between(1,8,Y),
non_member([X,Y],Forbidden).
现在你有一条路径:
..., closure0(step(Forbidden), S0,S), ...
closure0/3
负责循环。