如何将字符串拆分为PROLOG中的字符列表?

时间:2018-04-01 02:43:17

标签: prolog dcg

目前,在我的代码中,我有一个单词列表,排列如下:

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'中,而不是必须先添加所有字母除以逗号的单词?

1 个答案:

答案 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].

从逻辑的角度来看这很好,但从操作上讲,将规则中的目标按照完全相反的顺序更有效。