我正在处理化合物名称。我习惯用DCG规则来定义名称格式。但输入是列表格式,这不是一个好方法。因为元素由separater分隔。但我想作为一个字符串输入与"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]
。我尝试了很多方法,但无法获得正确的代码。请帮助我。
答案 0 :(得分:1)
为了简单起见,我会进行内联标记:
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 :(得分:0)
让我们回答一下,我的输入就像"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 ;