Один из способов - использовать предикаты 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.