2016-11-28 3 views
0

私は、指定された入力文字列に対してプロローグの正規表現に似た式を照合しようとしています。プロローグで特定の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"). 
... 

どのようにこのケースにアプローチするのですか? 。どのように最初の引数を分割し、パターンマッチを使用して文字列の各要素を1つずつチェックすることができますか?

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

答えて

0

これは実行したいジョブの場合は、既存の正規表現ライブラリを使用します。 pack_install(regex)を実行してインストールできるSWI-Prolog用のものがあります。

これを他の理由で実装したい場合は、最初に正規表現を構文解析してより使いやすい表現にしてから、それを使用してmatch述語を作成する必要があります。 DCGsは両方の部分に役立つはずです。例えば

[_$]?[a-z]|[a-z][a-z_]*[a-z]のあなたの正規表現は

あなたが完全な初心者であれば、あなたはその後、

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

ようなルールで文字のリストと照合することができます

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

のような用語に変換することができこれは簡単ではありませんが、具体的な問題を支援してくれることは喜ばしいことです!

関連する問題