我正在尝试为另一个列表中的每个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
来查看我做错了什么时,它说它无法退出并以无休止的循环再次启动。
为什么无法退出?
答案 0 :(得分:0)
为什么无法退出?
因为您在未实例化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] ;
...
但是,我看不到从[a,b,a,b,a,b]
获取append_to_list([a], [1,2,3], X)
的“逻辑”方式。如果您真正想要的是[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).
编辑
在明确需要什么之后,我建议看看这个other answer。