代码之家  ›  专栏  ›  技术社区  ›  aioobe

Prolog:reverse([],A)vs reverse(A,[])

  •  3
  • aioobe  · 技术社区  · 14 年前

    reverse([], A). 如果我给你的话,效果很好 reverse(A, []). 然后回答 ; 一经建议,它就挂了!

    为什么?(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 回复  |  直到 10 年前
        1
  •  4
  •   Sage Mitchell    14 年前

    在我看来,对内置谓词的优化过于热情了。无论第二个参数中列表的内容如何,都会出现相同的问题。根据GProlog手册,这是一个bug。请注意 template for reverse

    reverse(?list, ?list)
    

    更进一步说 ? 意思是“参数可以实例化,也可以是变量。”

    ?- reverse([], A).
    A = [].
    
    ?- reverse(A, []).
    A = [] ;
    false.
    
        2
  •  0
  •   false    10 年前

    在这里:

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