【问题标题】:Appending to a list using recursion goes into endless loop in Prolog使用递归附加到列表进入 Prolog 中的无限循环
【发布时间】:2018-10-21 22:39:17
【问题描述】:

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

为什么无法退出?

【问题讨论】:

  • append_to_list([a], [1,2,3], X) 中的数字 1、2 和 3 的用途是什么?
  • 我只是在这里放了一个随机数的例子,它实际上做了更多的事情。但它仍然进入无限循环,输出相同。
  • 不管具体数字是多少,我都看不出列表的重点。
  • @lurker 编辑了问题,使其更易于理解
  • 感谢您更新问题。这与您之前询问的结果截然不同。

标签: list prolog


【解决方案1】:

为什么无法退出?

因为您调用 append(R, ['a', 'b'], New), 时 R 和 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).

编辑

在澄清需要什么后,我建议看到这个other answer

【讨论】:

  • 对不起,我以为我已经提供了足够的信息,但看起来我的问题措辞不佳。我已经编辑了这个问题。你现在有机会帮助我吗?
  • 既然我在你提供的链接上找到了答案,我会接受这个作为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2016-10-06
相关资源
最近更新 更多