我想编写一个 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
for Rel
。我尝试在标签之间使用非空格分隔符,效果很好。我应该如何重写label_with_spaces
谓词以仅消耗所需的输入?