Пролог - вычитать каждый элемент только один раз - PullRequest
1 голос
/ 07 декабря 2011

когда я использую встроенный предикат пролога "вычитать / 3": вычитать (+ Set, + Delete, -Result), например:

subtract([a,b,c,d,c,c,d,e], [c,a], X).  
X = [b, d, d, e].  

, но я хочу вычесть каждый элемент в +Удалить из + Установить ОДИН РАЗ.Я имею в виду, я хочу

subtract([a,b,c,d,c,c,d,e], [c,a], X). to give
X = [b, d, c, c, d, e].

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Вы можете сделать что-то вроде этого:

subtract_custom(Remainder, [], Remainder).
subtract_custom(List, [Current|Delete], X) :-
    select(Current, List, Rest),
    subtract_custom(Rest, Delete, X).

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

2 голосов
/ 07 декабря 2011

Вы можете создать свою собственную процедуру, которая делает это.Например:

subtract_once(List, [], List).
subtract_once(List, [Item|Delete], Result):-
  (select(Item, List, NList)->
    subtract_once(NList, Delete, Result);
    (List\=[],subtract_once(List, Delete, Result))).

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

...