Создание функции удаления члена в прологе - PullRequest
1 голос
/ 31 марта 2010

Я новичок в Прологе и пытаюсь создать функцию, которая просто удалит все экземпляры элемента из списка. Следующий код - это то, что у меня есть:

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 ]

3 голосов
/ 01 апреля 2010

Это утверждение

[H|T] == []

никогда не может быть истинным, поскольку пустой список никогда не может быть идентичен списку, который содержит хотя бы один элемент.

1 голос
/ 31 марта 2010

То, что вам нужно, это предикат 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.
...