在序言中使用匹配列表进行标记
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 ;
我正在使用化合物 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 ;