Предикат ниже, fix_words(+WordsIn, -WordsOut)
, будет «исправлять» слова (термины) в WordsIn
, давая WordsOut
. «fix» означает, что ЛЮБЫЙ символ в слове, который не принадлежит, будет удален, независимо от того, где он встречается в слове (а не только в конце). Эта конкретная версия отвергает все, что не является алфавитом, но вы можете легко изменить его на все, что пожелаете, изменив условную проверку в remove_baddies/2
.
fix_words([WordIn | WordsIn], [WordOut | WordsOut]) :-
fix_word(WordIn, WordOut),
fix_words(WordsIn, WordsOut).
fix_words([], []).
fix_word(WordIn, WordOut) :-
atom_chars(WordIn, CharsIn),
remove_baddies(CharsIn, CharsOut),
atom_chars(WordOut, CharsOut).
remove_baddies([Char | CharsIn], [Char | CharsOut]) :-
(Char @>= 'A', Char @=< 'Z';
Char @>= 'a', Char @=< 'z'), !,
remove_baddies(CharsIn, CharsOut).
remove_baddies([_ | CharsIn], CharsOut) :-
remove_baddies(CharsIn, CharsOut).
remove_baddies([], []).
Если вы просто заинтересованы в удалении запятые, то определение remove_baddies
может быть:
remove_baddies([',' | CharsIn], CharsOut) :- !,
remove_baddies(CharsIn, CharsOut).
remove_baddies([Char | CharsIn], [Char | CharsOut]) :-
remove_baddies(CharsIn, CharsOut).
remove_baddies([], []).
выше использует только ISO предикаты (atom_chars/2
). SWI Prolog и GNU Prolog могут предлагать некоторые встроенные модули, которые делают это немного проще для определения типа символа (, например, предикат char_type/2
SWI Prolog).
Термин 'L = [собака, кошка, тигр, медведь]' не является синтаксически действительным. Отсутствуют двойные кавычки или одинарные кавычки? –
Предполагая, что вы исправите ошибку синтаксиса в своем списке, какие «конкретные символы» вы хотите удалить? И могут ли они встречаться где угодно в строке или просто в конце? – lurker
Я извлекаю этот список терминов из текста. Но иногда я нахожу некоторые неправильные термины, подобные этому примеру. Эти условия встречаются в любом месте строки. –