在序言中使用匹配列表进行标记

tokenizing with matching list in prolog

我正在使用化合物 names.I 用于 DCG 规则来定义名称 format.but 输入是列表格式,这不是一个好的 way.because 元素由 separater.but 我想要像 "1-butene" 这样的一个字符串输入,它作为 ['1','-',but,ene] 发送。我的代码在这里。

stem11-->[but]|[pent]|[hex]|[hept].
suf --> [ene]|[yne].
seperater-->['-'].
numerals-->['1']|['2']|['3']|['4']|['5']|['6']|['7'].

main-->numerals,seperater,stem11,suf.
check(S):-tokenize(S,L),main(L,[]).
这里
tokenize("1-butene",L).
L=['1','-',but,ene].

我想要输入可能像 [1-butene] 的标记化代码。我尝试了很多方法,但无法获得正确的 code.please 帮助。

为了简单起见,我会进行内联标记化:

stem11    -->"but"|"pent"|"hex"|"hept".
suf       -->"ene"|"yne".
seperator -->"-".
numerals  -->"1"|"2". % etc
main      -->numerals,seperator,stem11,suf.

然后使用 ?- phrase(main, "1-butene").?- main("1-butene", []).

编辑

stem11(A)    --> atom(["but","pent","hex","hept"], A).
suf(A)       --> atom(["ene","yne"], A).
separator(-) -->"-".
numerals(A)  --> atom(["1","2","3","4","5","6","7"], A).

atom(L, A) --> {member(S, L)}, atom_match(S), {atom_codes(A, S)}.
atom_match([]) --> [].
atom_match([C|Cs]) --> [C], atom_match(Cs).

tokenize([A,B,C,D]) --> numerals(A), separator(B), stem11(C), suf(D).

check(S,L) :- phrase(tokenize(L), S, []).

产量(使用 GnuProlog 测试)

?- check("1-butene",L).
L = ['1',-,but,ene] ? 

让我们试试我的答案,我的输入如下"1-butene"

stem11-->[but]|[pent]|[hex]|[hept].
suf --> [ene]|[yne].
seperater-->['-'].
numerals-->['1']|['2']|['3']|['4']|['5']|['6']|['7'].
main-->numerals,seperater,stem11,suf.

:-set_prolog_flag(double_quotes, codes).
any(A,K) --> {member(S,K)}, S, {atom_codes(A, S)}.
words(A) --> any(A,["but","pent","hex","hept","ene","yne","-","1","2","3"]).
split([]) --> "". split([X|Xs]) --> words(X), split(Xs).
tokenize(S,L):-phrase(split(L),S).

check(S):-tokenize(S,L),main(L,[]).
像这样查询。

?- tokenize("1-butene",L).
L = ['1', -, but, ene] ;

?- check("1-butene").
true ;