Пролог добавление и удаление элемента списка, если его нет во втором списке - PullRequest
2 голосов
/ 07 июня 2010

Я не знаю, что мне здесь не хватает.

Я хочу добавить элемент, если он находится в arg1, но не в arg2, и хочу удалить элемент, если он находится в arg1, но не в arg2.

Я использую условие if, включающее функцию, которая возвращает true, если элемент находится в списке arg2, в противном случае - false. Затем используйте встроенные предикаты append и выберите, чтобы добавить или удалить.

Я ложусь на все мои цели поиска. Я комментирую и раскомментирую в зависимости от того, какой предикат я хочу, добавить или удалить.

includes([],_).
includes([P|Z],S) :-
    memberchk(P,S), includes(Z,S).

addop([],list,res).
addop([P|R],list,res) :-
    includes(P,s0) -> addop(R,list,res) ; append(P,list,res),
    addop(R,list,res).


rem([],list,res).
rem([P|R],list,res) :-
    includes(P,list) -> rem(R,list,res) ; select(P,list,res),
    rem(R,list,res).

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 07 июня 2010

list, res и s0 - атомы. Заглавные буквы каждой буквы, чтобы сделать их переменными.

В настоящий момент ваши вызовы в addop и res, вероятно, не выполняются, поскольку нет соответствующего правила.

1 голос
/ 07 июня 2010

Вам действительно нужно использовать memberchk и includes? Если элементы списка просты, вы можете использовать предикат member (который часто встроен):

% member(Element, List) -- determines whether Element is a member of list List
member(X, [X|_]).
member(X, [_|T]):- member(X, T).

Используя это, addop можно определить следующим образом:

% addop(A, B, R) -- returns items from A which are not in B
% (filters A over B)
addop(A, [], A).
addop([], _, []).
addop([H | T], L, R):- member(H, L), addop(T, L, R). % skip the item
addop([H | T], L, [H | R]) :- addop(T, L, R). % add the item to the result

Добавить rem может быть:

% rem(A, B, R) -- returns items from A which are in B
% (A intersect B)
rem(_, [], []).
rem([], _, []).
rem([H | T], L, [H | R]) :- member(H, L), rem(T, L, R). % add the item to result
rem([_ | T], L, R):- rem(T, L, R).
1 голос
/ 07 июня 2010

Два комментария о вашем коде:

  • ваш включает в себя предикат, кажется, принимает список в качестве первого аргумента, но вы, кажется, используете его, как если бы он был атомом из addopи rem.
  • ваш предикат addop ссылается на s0, который нигде не определен, поэтому ваш код не компилируется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...