我在使用Prolog中的列表时遇到了麻烦。我正在实施一个Wumpus World示例,需要在每次用户移动期间移动wumpus。 wumpus的移动是在列表中预定义的,我不知道如何弹出列表的头部来设置wumpus的位置。 Wumpus列表将是:[left,right,up,down,...,right]。这是我到目前为止所做的,这显然是错误的。
我真的不需要我的代码的确切代码,只是一个列表的示例以及如何从列表中设置方向/值以及如何删除列表中弹出的头部将是理想的。
wumpusPath([left,up,down,right,left,down]).
moveWumpus :-
wumpusDirection(wumpusPath),
wumpusLocation(X,Y),
newLocation(X,Y,wumpusDirection,X1,Y1),
worldSize(CheckX,CheckY),
X1 =< CheckX,
X1 > 0,
Y1 =< CheckY,
Y1 > 0,
!,
retract(wumpusLocation(X,Y)),
assert(wumpusLocation(X1,Y1)).
答案 0 :(得分:2)
请记住,列表可以通过尾部访问:如果L = [a,b,c]且L = [H | T]然后H与a统一,T与[b,c]统一。
答案 1 :(得分:1)
wumpusPath([left,up,down,right,left,down]).
wumpusDirection([D|P],D,P). % see below ****
moveWumpus :-
wumpusPath(Path), % retrieve the Path
wumpusDirection(Path,Direction,NewPath), % set Direction from it ****
wumpusLocation(X,Y),
newLocation(X,Y,Direction,X1,Y1),
worldSize(CheckX,CheckY),
X1 =< CheckX,
X1 > 0,
Y1 =< CheckY,
Y1 > 0,
!,
retractall(wumpusLocation(X,Y)), % remember NewPath somehow too
asserta(wumpusLocation(X1,Y1)).
但是,不是断言事实,最好让你的move
谓词使用参数:有些将“in”,有些“out”:
moveWumpus(Path,X,Y, NewPath,X1,Y1) :-
wumpusDirection(Path,Direction,NewPath),
newLocation(X,Y,Direction,X1,Y1),
worldSize(CheckX,CheckY),
X1 =< CheckX,
X1 > 0,
Y1 =< CheckY,
Y1 > 0,
!
.