实施反向列表时不停止
这是我的实现:
popped_last_el([], [_]).
popped_last_el([F | R], [F | X]) :- popped_last_el(R, X).
last_el(X, [X]).
last_el(X, [_ | L]) :- last_el(X, L).
reverse_list([], []).
reverse_list([F | R], L2) :- last_el(F, L2), popped_last_el(L, L2), reverse_list(R, L).
当我查询reververs_list([a,b],x)
时,它会按预期输出x = [b,a]
。但是,当我使用;
要求另一种解决方案时,Prolog无限期运行。为什么?
This is my implementation:
popped_last_el([], [_]).
popped_last_el([F | R], [F | X]) :- popped_last_el(R, X).
last_el(X, [X]).
last_el(X, [_ | L]) :- last_el(X, L).
reverse_list([], []).
reverse_list([F | R], L2) :- last_el(F, L2), popped_last_el(L, L2), reverse_list(R, L).
When I query reverse_list([a, b], X)
, it outputs X = [b, a]
as expected. But when I ask for another solution using ;
, prolog runs indefinitely. Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是 fafic-slice to解释为什么该程序仍然循环。您的程序中只有这个很小的部分才是责任的非终止。您将不得不在这一部分修复 ,以使非终止消失。
您可以从此失败板中看到的内容:
l2
需要已知('Intantiated')才能使last_el/2
终止。但这不是。Here is a failure-slice to explain why the program still loops. Only this very tiny part of your program is responsible for non-termination. You will have to fix something in that part to make non-termination go away.
What you can see from this failure-slice:
L2
needs to be known ('instantiated') to makelast_el/2
terminate. But it is not.