在州名单上应用效果

时间:2014-12-04 16:35:04

标签: prolog

我想在当前状态下应用效果列表,换句话说,如果当前状态具有与拒绝该条件的效果相对应的条件,则具有动作生成的效果列表。< / 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]).

1 个答案:

答案 0 :(得分:1)

您的insertremove都应为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)不会失败。

相关问题