我正在尝试为另一个列表中的每个Element
附加列表,但我陷入了一个无限循环。
?- append_to_list([a, b], [1,2,3], X).
find([], E, []).
find([H|T], E, [[H, E]|Res]) :-
find(T, E, Res).
append_to_list(L, [], []).
append_to_list(L, [H|T], Res) :-
find(L, H, R),
append(Res, R, New),
append_to_list(L, T, New).
我想用这个例子得到的输出是:
X = [[a,1],[a,2],[a,3],[b,1],[b,2],[b,3]].
当我试图trace
看看我做错了什么时,它说它无法退出并在无限循环中重新启动它。
为什么无法退出?
为什么无法退出?
因为您在 R 和 New 都没有实例化的情况下调用append(R, ['a', 'b'], New),
,并且 Prolog 在回溯时计算出无限的解决方案。
?- append(R, ['a', 'b'], New).
R = [],
New = [a, b] ;
R = [_3986],
New = [_3986, a, b] ;
R = [_3986, _3998],
New = [_3986, _3998, a, b] ;
...
但是,我看不到从append_to_list([a], [1,2,3], X)
获得[a,b,a,b,a,b]
的"合乎逻辑"的方法。如果您真正想要的是[a,a,b,a,b,a,b]
,这很容易:
append_to_list(L, [], L).
append_to_list(L, [_|T], R) :-
append(L, [a, b], New),
append_to_list(New, T, R).
编辑
在澄清了需要什么之后,我建议看看另一个答案。