我正在尝试生成从 N 到 1 的数字列表,而不使用任何内置谓词(例如 findall 或 numlist)。我究竟做错了什么 ?
pred(N,[H|T]):- H is N, N1 is N-1, pred(N1,T).
pred(1,[]).
我不断收到错误:超出全局堆栈
最完整的解决方案是:
pred(1, [1]).
pred(N, [N|T]) :-
N > 1,
N1 is N-1,
pred(N1, T).
如果没有N > 1
条件你仍然会得到堆栈溢出:
| ?- pred(3, L).
L = [3,2,1] ? ;
Fatal Error: global stack overflow (size: 32768 Kb, reached: 32765 Kb, environment variable used: GLOBALSZ)
但随着N > 1
健康)状况:
| ?- pred(3, L).
L = [3,2,1] ? ;
(1 ms) no
| ?-
此外,在正确的条件下,谓词的顺序不再重要。这是因为您的条款只能在其应有的条件下有效。没有它,你的pred(N, [N|T]) :- ...
子句,仅在以下情况下运行N > 1
也会尝试运行时N =< 1
。交换子句顺序只会隐藏这个问题,而且只是在一定程度上隐藏。然而,顺序对于效率来说很重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)