Пролог: Как мне удалить подсписок из списка?(Дополнительный вопрос) - PullRequest
0 голосов
/ 12 октября 2018

Новичок в Прологе и не очень хорошо понимает рекурсию в Прологе, поэтому я не уверен, как извлечь элемент из списка, который уже был рассмотрен.

Это дополнительный вопрос кмой предыдущий вопрос: Пролог: Как вы перебираете два списка (nest for-loop)?

У меня есть два списка:

stringList([hello, hi], [bye,later], X).

где функция stringListвыглядит так:

stringList(As, Bs, [A,B]) :-
  member(A, As),
  member(B, Bs).

Это приводит к выводу:

X = [hi, bye] ;
X = [hi, later] ;
X = [hello, bye] ;
X = [hello, later].

Теперь я хочу удалить подсписок из двух списков.Например, если X = [hi, later], я хочу убрать привет, а потом мой следующий X = [hello, bye].Это становится более важным, когда мой список большой.

Я знаю, что мне нужно пройти курс лечения, поэтому я создал базовый вариант:

stringList([],[],[]).

1 Ответ

0 голосов
/ 12 октября 2018

Один из способов - использовать предикаты findall/3 и delete/3.В настоящее время ваш stringList/3 генерирует решения по одному, поэтому вам нужно собрать все эти решения в один список, используя findall/3, а затем удалить все, что вы хотите:

deleteSublist(As, Bs, Elem, L):- 
       findall([X,Y], stringList(As, Bs, [X,Y]), L1),
       delete(L1, Elem, L).

Пример:

?- deleteSublist([hello, hi], [bye,later], [hi,_], L).
L = [[hello, bye], [hello, later]].

В приведенном выше примере элемент, который вы хотите удалить, может быть просто [hi,bye], но мы используем [hi,_], чтобы удалить все вхождения hi.

Теперь, чтобы ответить на ваш вопрос, это легко сделать с помощью рекурсии, но для использования рекурсии вам нужно все решение в одном списке, чтобы позже вы могли рекурсивно извлечь элементы из этого списка.Часть рекурсии в приведенном выше решении скрыта внутри встроенного delete/3.Поэтому, если вы хотите использовать свое собственное рекурсивное решение, просто напишите свое собственное рекурсивное определение delete/3 (я думаю, что это уже должно быть задано в переполнении стека, чтобы вы могли искать его или гуглить ...)

Другоевещь, если вы хотите, чтобы ваше решение генерировало одно решение за раз, как в предикате stringList/3, вы также можете использовать этот простой способ ниже:

?- stringList([hello, hi], [bye,later], X),(X \= [hi,_]).
X = [hello, bye] ;
X = [hello, later] ;
false.

В приведенном выше примере мы используем преимущество, что \= терпит неудачунапример, при сравнении [hi,bye] \= [hi,_], в то время как при использовании чистого dif/2 это будет успешным:

?- stringList([hello, hi], [bye,later], X),dif(X,[hi,_]).
X = [hello, bye] ;
X = [hello, later] ;
X = [hi, bye] ;
X = [hi, later].

Поэтому при использовании dif / 2 вам потребуется более подробное ограничение:

?- stringList([hello, hi], [bye,later], X),dif(X,[hi,bye]), dif(X,[hi,later]).
X = [hello, bye] ;
X = [hello, later] ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...