Как сопоставить строку для заданного выражения reg в прологе?

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

match_function([_$]?[a-z]|[a-z][a-z_]*[a-z],"+ab_c").
false
match_function([_$]?[A-Z]|[A-Z][A-Z_]*[A-Z],"+AB_C").
...

Любые указатели, как подойти к этому делу?, Например, как я могу разделить первый аргумент и проверить каждый элемент строки один за другим, используя сопоставление с образцом? что-то вроде

match([_$],[X|Xs]):-
member(X,"_$").
     match_next(NEXT_ELMENT_IN_THE_STRING)...

1 ответ

Если это для работы, которую вы просто хотите выполнить, используйте существующую библиотеку регулярных выражений. Есть один для SWI-Prolog, который вы можете установить, запустив pack_install(regex),

Если вы хотите / должны реализовать это по какой-то другой причине, вам следует сначала проанализировать регулярное выражение в представлении, с которым легче работать, а затем написать свой match предикат, используя это. DCG должны быть полезны для обеих частей.

Например, ваше регулярное выражение [_$]?[a-z]|[a-z][a-z_]*[a-z] может быть превращен в термин, как

choice(sequence([option(one_of(['_', '$'])), range(a, z)]),
       sequence([range(a, z), any(one_of([range(a, z), '_']), range(a, z)]))

который вы можете затем сопоставить со списками символов с правилами, такими как

match(one_of(Chars)) -->
    [C],
    { member(C, Chars) }.

Если вы начинающий, это будет непросто, но мы будем рады помочь с конкретными проблемами!

Другие вопросы по тегам