我无法理解这一点:如果我给Prolog reverse([], A).
它可行,如果我给它reverse(A, []).
并在第一个建议时回答;
它会挂起! / p>
为什么呢? (GNU Prolog和SICStus Prolog的结果相同!)
aioobe@r60:~$ prolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- reverse([], A).
A = []
yes
| ?- reverse(A, []).
A = [] ? ;
Fatal Error: global stack overflow (size: 32768 Kb,
environment variable used: GLOBALSZ)
aioobe@r60:~$
答案 0 :(得分:4)
对我来说,看起来像是对内置谓词的过分热情优化。无论第二个参数中列表的内容如何,都会出现同样的问题。根据GProlog手册,这是一个错误。请注意template for reverse
是
reverse(?list, ?list)
此外,?
表示“可以实例化参数或变量”。
SWI-Prolog版本5.6.64给出了预期的结果。
?- reverse([], A).
A = [].
?- reverse(A, []).
A = [] ;
false.
答案 1 :(得分:0)
我的反向做了同样的事情,因为我假设参数1将被实例化(即反向(+,?),如上所述),知道我的Prolog将对其进行索引。 这里:
reverse(L, R) :- reverse_1(L, [], R).
reverse_1([], X, X). % <-- doesn't loop on unbound arg #1 if this clause cuts
reverse_1([A|As], X, R) :-
reverse_1(As, [A|X], R).