Как написать код разницы набора без использования memberchk и вычитать? - PullRequest
0 голосов
/ 26 апреля 2020

Как написать код установленной разности без использования memberchk и вычитать?

 set_difference( [], _, [] ) :- !.
 set_difference( [A|C], B, D ) :-
      memberchk( A, B ), !,
 subtract( C, B, D ).
 set_difference( [A|B], C, [A|D] ) :-
      subtract( B, C, D ).

1 Ответ

0 голосов
/ 26 апреля 2020

Вы должны рекурсивно go вниз список A, составить список Aout, охватывая буксирные случаи:

  • Элемент X на кончике A находится в списке B -> забыть о X, recurse (действительно, заполнить индуктивное определение для my_set_difference(A,B,Aout))
  • Элемент X на кончике A не является списком B -> оставьте X для Aout, рекурсивный (действительно, заполните индуктивное определение для my_set_difference(A,B,Aout))
  • Базовый случай: A пуст. Очевидно, что Aout также должен быть пустым.

Вышеприведенное естественным образом сопоставлено двум пунктам для предиката my_set_difference(A,B,Aout).

Поскольку у вас нет member/2 для проверьте, находится ли кончик A в списке B, вам нужно запрограммировать look(X,B), который ищет X в B путем сканирования B. Это полностью аналогично приведенному выше, но вы можете остановиться рано, если найдете X в B.

Примите это, это простое упражнение.

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