使用递归附加到列表在 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看看我做错了什么时,它说它无法退出并在无限循环中重新启动它。

为什么无法退出?

为什么无法退出?

因为您在 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).

编辑

在澄清了需要什么之后,我建议看看另一个答案。

最新更新