使用递归追加到列表进入Prolog中的无穷循环

时间:2018-10-21 22:39:18

标签: list prolog

我正在尝试为另一个列表中的每个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来查看我做错了什么时,它说它无法退出并以无休止的循环再次启动。

为什么无法退出?

1 个答案:

答案 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