Prolog:反向([],A)与反向(A,[])

时间:2010-09-10 13:56:24

标签: prolog

我无法理解这一点:如果我给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:~$

2 个答案:

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