Я собираюсь предположить, что у вас есть список char-атомов, например [a,b,c,d,e,f,a,b,c]
, и вы хотите, чтобы он был [a,b,a,b]
. Пустой список - это ваш базовый случай:
check([], []).
Затем, беспокойтесь о том, находится ли текущий символ в вашем приемлемом списке:
check([C|Cs], Result) :-
check(Cs, Rs),
(arc(_, C, _)
-> Result = [C|Rs]
; Result = Rs).
В действии:
?- check([a,b,c,d,a,b,e], X).
X = [a, b, a, b].
Вы можете использовать string_chars/2
для преобразования между строками SWI и этим представлением, если необходимо:
?- string_chars("abcdabe", S), check(S, SFiltered), string_chars(FilteredString, SFiltered).
S = [a, b, c, d, a, b, e],
SFiltered = [a, b, a, b],
FilteredString = "abab".