我想在当前状态下应用效果列表,换句话说,如果当前状态具有与拒绝该条件的效果相对应的条件,则具有动作生成的效果列表。< / p>
如果我有当前状态:
[clear(b),on(b,a),on(a,mesa),clear(d),on(d,c),on(c,desk)]
效果列表:
[-clear(d), -on(d.c), on(c,d)]
结果将是:
[clear(b),on(b,a),on(a,mesa), on(c,d), on(c,desk)]
这就是我现在所得到的,任何帮助都会受到赞赏!
applyEffects(currentState,Effects,result)
insert(Element, List,result)
remove(Element,List, result)
applyEffects([],L,L).
applyEffects(L,[],L).
applyEffects([X|XTail], [-X|YTail], A) :-
insert(X, A, B),
applyEffects([X|XTail],YTail, B).
insert(E, L1, [E|L1]).
remove(X, [X|L1], L1).
remove(X, [Y|L1], A):- remove(X,L1,[L1|Y]).
答案 0 :(得分:1)
您的insert
和remove
都应为select
(通常是内置的)。
如果您有“否定”参数,您可能想要区分:
applyEffects(L,[],L).
applyEffects(L,[-X|R],A):-
!,
applyEffects(L,R,Y),
select(X,Y,A).
applyEffects(L,[X|R],[X|Y]):-
applyEffects(L,R,Y).
第二个子句中使用的剪切是红色剪切,使其变为绿色,在第三个子句中添加\+ X = - _
行。
如果您想允许不存在的否定,请将第二个子句更改为:
applyEffects(L,[-X|R],A):-
!,
applyEffects(L,R,Y),
(select(X,Y,A),!;
Y = A).
现在applyEffects([],[-on(something)],X)
不会失败。