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

在prolog中创建“remove member”函数

  •  1
  • screenshot345  · 技术社区  · 16 年前

    我是prolog的新手,我正在尝试创建一个函数,这个函数将从列表中删除一个元素的所有实例。以下是我目前掌握的代码:

    remove([H|T], E, L2) :- (\+ ([H|T] == []) ->
        (H == E
            -> remove(T, E, L2)
            ; append(L2, H, L2), remove(T, E, L2)
        )
        ; append(L2, [])
    ).
    

    当我在上运行此代码时:

    remove([1,2,3,4,5], 3, L2).
    

    我得到一个错误:

    ERROR: Out of global stack
    

    有人能告诉我为什么我会遇到这个问题吗?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Kaarel    16 年前

    本声明

    [H|T] == []
    

    永远不能为true,因为空列表永远不能与至少包含一个元素的列表相同。

        2
  •  1
  •   Volodymyr Gubarkov    16 年前

    你需要的是一个SWI 减去 谓语:

     ?- subtract([1,1,2,3,1],[1,2],R).
    R = [3].
    
     ?- listing(subtract).
    lists:subtract([], _, []) :- !.
    lists:subtract([A|C], B, D) :-
            memberchk(A, B), !,
            subtract(C, B, D).
    lists:subtract([A|B], C, [A|D]) :-
            subtract(B, C, D).
    
    true.