【发布时间】:2022-01-19 12:31:37
【问题描述】:
我想写change_state(+L1, +L2, -L3).
L1 包含状态,例如:[碾磨、烧毁] L2 包含谓词,例如:[del(milled), add(shifted)] 而L3就是返回列表。
例子:
L1 = [milled, burned]
L2 = [del(burned), add(shifted)]
L3 = [milled, shifted]
所以 L1 是我的起始列表,根据 L2 中的谓词,我会更改 L1 的状态。
这是我的递归解决方案:
change_state([], [], []).
change_state(X, [], []).
change_state(State, [H|T], NewState) :-
functor(H, N, 1),
arg(1, H, A),
( N = del
-> remove_from_list(A, State, NewState)
; arg(1, H, A),
add_to_list(A, State, NewState) ),
print(NewState),
change_state(NewState, T, X),
print(NewState).
我还把一些打印到函数中进行调试。
现在的问题:
如果我用
调用函数change_state([milled, burned], [del(burned), add(lol), add(hi)], L).
我得到了结果
L = [milled].
所以只有 L2 中的第一个谓词有效。
但打印显示我:
[milled][lol,milled][hi,lol,milled][hi,lol,milled][lol,milled][milled].
所以它确实有效,但是由于递归,它回到了第一个状态。
知道如何解决这个问题吗?
【问题讨论】:
-
change_state(State, [H|T], NewState) :- ...不应该是change_state(State, [H|T], X) :- ...考虑到您的几乎尾递归调用change_state(NewState, T, X)? -
@RuudHelderman 刚刚尝试过,但现在我的退货清单是空的。
-
子句
change_state(X, [], []).必须替换为change_state(X, [], X)。 -
结合你的两个答案有效!非常感谢!!