如何在PROLOG中实现字符串自动拆分为字符列表?
简化Prolog词汇项定义:自动拆分单词为字符列表
嘿,这个需求其实很好解决,咱们只需要借助Prolog的内置工具,把「词汇定义」和「字符拆分」的逻辑分开,就能告别手动拆字母的麻烦啦!
核心思路
原来的写法是直接把单词拆成字符列表写死,现在咱们把它拆成两层:
- 用一个辅助谓词专门存放完整的单词(原子形式,直接写单词就行)
- 让原来的
lexical_item调用这个辅助谓词,再通过内置谓词自动把单词转换成字符列表
修改后的代码示例
% 辅助谓词:直接定义完整单词,新增词汇只需要在这里加一行 lexical_item_atom(am). lexical_item_atom(est). lexical_item_atom(rapid). lexical_item_atom(car). % 新增的car,直接写就行,不用拆字母 % 主谓词:把原子转换成字符列表 lexical_item(Chars) :- lexical_item_atom(WordAtom), atom_chars(WordAtom, Chars).
怎么用?
现在你查询的时候,就能直接得到拆分后的字符列表了:
?- lexical_item(X). X = [a,m] ; X = [e,s,t] ; X = [r,a,p,i,d] ; X = [c,a,r].
如果要验证某个字符列表是否是合法词汇,也能直接查:
?- lexical_item([c,a,r]). true.
为什么这么做?
这里用到的atom_chars/2是Prolog的内置谓词,它的作用就是把一个原子(比如rapid)转换成对应的单个字符组成的列表[r,a,p,i,d],反过来也能把字符列表转成原子,完全不用咱们手动拆分。
要是你用的是支持字符串的Prolog(比如SWI-Prolog),也可以用string_chars/2,不过用原子的写法更简洁,直接写单词就行,不用加引号。
内容的提问来源于stack exchange,提问作者Ricardo Potozky
相关产品推荐
相关产品推荐

