使用prolog中的匹配列表进行标记

时间:2016-01-03 10:48:26

标签: list prolog tokenize

我正在处理化合物名称。我习惯用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]。我尝试了很多方法,但无法获得正确的代码。请帮助我。

2 个答案:

答案 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 ;