Prolog在实现反向列表时不停止



这是我的实现:

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).

当我查询reverse_list([a, b], X)时,它如预期输出X = [b, a]。但是当我要求使用;的另一个解决方案时,prolog无限期地运行。为什么?

为什么?

下面是一个故障片来解释为什么程序仍然循环。只有程序的这一小部分是负责不终止的。你必须在那部分修改一些的东西,以使不可终止性消失。

      last_el(X, [X]):- false。last_el (X, [_ | L]):——last_el (X, L), reverse_list([], []):- false。reverse_list([F | R], L2):-last_el(F, L2), false,<年代> popped_last_el (L, L2) ,<年代> reverse_list (R, L) 。- reverse_list([a, b], X), false。循环。

从这个故障片可以看到:

L2需要被知道('实例化')才能使last_el/2终止。但它不是。

最新更新