アルファベットラベル、スペース、スペースまたは文字を含む可能性のある疑似ラベル、別のスペース、別のアルファベットラベル、そして最後にピリオドを受け入れるDCG述語を次のように記述したいと思います。
label_madness --> label(Table1), " ", label_with_spaces(Rel), " ", label(Table2), ".".
ラベルのコードは次のとおりです。
label(A) --> letters(S), {string_to_atom(S, A)}, !.
label_with_spaces(A) --> letters_or_spaces(S), {string_to_atom(S, A)}, !.
letters([C|D]) --> letter(C), letters(D), !.
letters([C]) --> letter(C), !.
letters_or_spaces([C|D]) --> letter(C), letters_or_spaces(D), !.
letters_or_spaces([C|D]) --> spacehyphen(C), letters_or_spaces(D), !.
letters_or_spaces([C]) --> letter(C), !.
letters_or_spaces([C]) --> spacehyphen(C), !.
letter(C) --> [C], {"a"=<C, C=<"z"}, !.
letter(C) --> [C], {"A"=<C, C=<"Z"}, !.
spacehyphen(E) --> " ", {from_list("-", E)}, !. % spaces are replaced with hyphens in the pseudolabel
from_list([E], E).
label_madness
のような文字列をフィードする"Alice is responsible for Bob."
と、失敗します。不思議な理由trace
で動作を拒否しますが、DCGが全体に一致するため失敗すると思いis responsible for Bob
ますRel
。ラベルの間にスペース以外の区切り文字を試してみましたが、正常に機能します。label_with_spaces
必要なだけの入力のみを消費するように述語を書き直すにはどうすればよいですか?