Prolog 两个房间的规划块世界序言
我需要一些关于如何解决这个问题的基本帮助。我有一个房间规划器,给定开始状态和结束状态,它使用递归解决这个问题。然而,我想解决两个州(又名房间)的问题。我决定设置旗帜将是我最好的选择,因为每个房间的状态都在room1或room2中。然而,我不知道如何实现这一点。有人能把我推向正确的方向吗 为了澄清,新的状态将是(ontable(X),room1)而不是ontable(X)Prolog 两个房间的规划块世界序言,prolog,planning,Prolog,Planning,我需要一些关于如何解决这个问题的基本帮助。我有一个房间规划器,给定开始状态和结束状态,它使用递归解决这个问题。然而,我想解决两个州(又名房间)的问题。我决定设置旗帜将是我最好的选择,因为每个房间的状态都在room1或room2中。然而,我不知道如何实现这一点。有人能把我推向正确的方向吗 为了澄清,新的状态将是(ontable(X),room1)而不是ontable(X) 所以我基本上是用旗子解决的。所以对于每个移动谓词,我基本上添加了一个room1和room2标志。如果它们是真的,那么它就会采取
所以我基本上是用旗子解决的。所以对于每个移动谓词,我基本上添加了一个room1和room2标志。如果它们是真的,那么它就会采取行动。例如,room1中的ontable(X),然后删除ontable并在room1中添加holding(X)。我还添加了两个谓词以在房间之间移动。最大的障碍是从程序逻辑转移到状态逻辑。因此,如果handempty在room1,那么它只能移动到room2@谢谢您的建议我会在ontable中添加房间标识符我如何在两个房间之间进行通信?那么,如果handempty在room1,那么将手臂移动到room2等的先决条件是什么?(拿着(X))等等。我想手空并不取决于空间,也不取决于拿着等等。这些都是玩家的属性。你应该在玩家道具中添加一个当前的房间(X),虽然这是有意义的,但是我怎么知道何时根据这些状态切换房间呢。假设房间2有ontable(x,room2)和current_房间(room2),我想从ontable(y,room1)中得到块y。我将如何在move谓词中表示这一点。我在考虑搬家(goroom1,[条件]表格(y,room1),[行动]当前房间(room2),[行动]当前房间(room1),(handempty,room1)。看起来相当明显……当然,这取决于细节。。。
:- module( planner,
[
plan/4,change_state/3,conditions_met/2,member_state/2,
move/3,go/2,test/0,test2/0
]).
:- [utils].
plan(State, Goal, _, Moves) :- equal_set(State, Goal),
write('moves are'), nl,
reverse_print_stack(Moves).
plan(State, Goal, Been_list, Moves) :-
move(Name, Preconditions, Actions),
conditions_met(Preconditions, State),
change_state(State, Actions, Child_state),
not(member_state(Child_state, Been_list)),
stack(Child_state, Been_list, New_been_list),
stack(Name, Moves, New_moves),
plan(Child_state, Goal, New_been_list, New_moves),!.
change_state(S, [], S).
change_state(S, [add(P)|T], S_new) :- change_state(S, T, S2),
add_to_set(P, S2, S_new), !.
change_state(S, [del(P)|T], S_new) :- change_state(S, T, S2),
remove_from_set(P, S2, S_new), !.
conditions_met(P, S) :- subset(P, S).
member_state(S, [H|_]) :- equal_set(S, H).
member_state(S, [_|T]) :- member_state(S, T).
/* move types */
move(pickup(X), [handempty, clear(X), on(X, Y)],
[del(handempty), del(clear(X)), del(on(X, Y)),
add(clear(Y)), add(holding(X))]).
move(pickup(X), [handempty, clear(X), ontable(X)],
[del(handempty), del(clear(X)), del(ontable(X)),
add(holding(X))]).
move(putdown(X), [holding(X)],
[del(holding(X)), add(ontable(X)), add(clear(X)),
add(handempty)]).
move(stack(X, Y), [holding(X), clear(Y)],
[del(holding(X)), del(clear(Y)), add(handempty), add(on(X, Y)),
add(clear(X))]).
move(goroom1, [handempty], []).
move(goroom1, [holding(X)], []).
move(goroom2, [handempty], []).
move(goroom2, [holding(X)], []).
/* run commands */
go(S, G) :- plan(S, G, [S], []).
test :- go([handempty, ontable(b), ontable(c), on(a, b), clear(c), clear(a)],
[handempty, ontable(c), on(a,b), on(b, c), clear(a)]).
test2 :- go([handempty, ontable(b), ontable(c), on(a, b), clear(c), clear(a)],
[handempty, ontable(a), ontable(b), on(c, b), clear(a), clear(c)]).