我是 Prolog 的初学者,我一直在尝试实现一段代码。
本质上,您输入一个字符串,其中字符串中的单词由空格或感叹号或逗号等分隔。
该字符串作为字符串列表返回,其中单词已解析。
例如,“stack,overflow!rocks”。将返回 ["stack","overflow","rocks"]
我想使用 swi prolog assoc 或一些地图结构来查找边界字符,但我无法弄清楚。
如果有任何帮助,我将不胜感激!
那些双引号字符串实际上是字符代码列表。然后 DCG 是处理解析的适当方法:
:- use_module(library(http/dcg_basics), [string//1]).
%% split input on Sep
splitter(Sep, [Chunk|R]) -->
string(Chunk),
( Sep -> !, splitter(Sep, R)
; [], {R = []}
).
Sep
上面可以是文字,也可以是非终结符。我们需要类似的东西
not_in_word --> [C], {\+code_type(C, alpha)}.
有这样的定义:
?- phrase(splitter(not_in_word, X), "stack,overflow!rocks.").
X = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115], []] .
我们可以使用 delete/3 删除空字符串:
?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."), delete(X, [], Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]] .
编辑我们可以轻松地将单词可视化为原子:
?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."),
delete(X, [], Y),
maplist(atom_codes, Z, Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]],
Z = [stack, overflow, rocks] .
注意 maplist(atom_codes, Atoms, Codes) 中的“输出”单词位置...