目前,在我的代码中,我有一个单词列表,排列如下:
lexical_item --> [a,m].
lexical_item --> [e,s,t].
lexical_item --> [r,a,p,i,d].
...
也就是说,当我需要添加一个新单词(例如' car')时,我必须手动将其添加为[c,a,r] ......
如何在代码中添加如下内容:
lexical_item --> [am].
lexical_item --> [est].
lexical_item --> [rapid].
...
而且,当我运行我的代码时,会自动转换' rapid'在' r,a,p,i,d'中,而不是必须先添加所有字母除以逗号的单词?
答案 0 :(得分:1)
自动转换'r,a,p,i,d'
中的'rapid'
我不确定为什么所有评论者都没有指出你想要的是atom_chars/2
:
?- atom_chars(rapid, Chars).
Chars = [r, a, p, i, d].
?- atom_chars(Atom, [r, a, p, i, d]).
Atom = rapid.
我们的想法是将您的单词数据库(表示为原子)与lexical_item//0
DCG规则分开,并在其中进行转换:
word(am).
word(est).
word(rapid).
lexical_item -->
{ word(W),
atom_chars(W, Chars) },
list(Chars).
list([]) -->
[].
list([X|Xs]) -->
[X],
list(Xs).
正如所写,lexical_item//0
规则可以非常普遍地用于识别单词,拒绝非单词以及枚举数据库中的所有单词:
?- phrase(lexical_item, [r,a,p,i,d]).
true.
?- phrase(lexical_item, [s,o,m,e,t,h,i,n,g]).
false.
?- phrase(lexical_item, Item).
Item = [a, m] ;
Item = [e, s, t] ;
Item = [r, a, p, i, d].
从逻辑的角度来看这很好,但从操作上讲,将规则中的目标按照完全相反的顺序更有效。