Как удалить переменную из списка переменных в прологе? - PullRequest
0 голосов
/ 31 января 2020

Я хочу реализовать алгоритм DPLL. Поэтому я должен удалить все вхождения переменной в список других переменных, например, удаление neg(X) из [neg(X), pos(X), neg(Y), pos(Y)] должно вернуть [pos(X), neg(Y), pos(Y)]. Я пробовал некоторые встроенные предикаты, такие как exclude / 3 или delete / 3, но все оставили меня с присваиванием X = Y и результатом [pos(X), pos(Y)], со всеми удаленными neg (_), но я хочу удалить только neg (X) и не нег (Y). Это как-то возможно?

1 Ответ

0 голосов
/ 31 января 2020

Из библиотеки Logtalk list объект:

delete([], _, []).
delete([Head| Tail], Element, Remaining) :-
    (   Head == Element ->
        delete(Tail, Element, Remaining)
    ;   Remaining = [Head| Tail2],
        delete(Tail, Element, Tail2)
    ).

Пример вызова:

?- delete([neg(X), pos(X), neg(Y), pos(Y)], neg(X), Rest).
Rest = [pos(X), neg(Y), pos(Y)].

Ключ должен использовать стандартный ==/2 термин равенство предикат вместо стандартного =/2 унификация предикат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...